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

Artifact da6d1e7a4f1c8d713ed5415b5ed21d82ef465c0f:


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 69 66  6)iTable;.    if
2ee0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
2ef0: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
2f00: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
2f10: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
2f20: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
2f30: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2f40: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
2f50: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
2f60: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
2f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f80: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
2f90: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
2fa0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2fb0: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2fc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2fd0: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2fe0: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2ff0: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
3000: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
3010: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3020: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
3030: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
3040: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3050: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
3060: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
3070: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
3080: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
3090: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
30a0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
30b0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
30c0: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
30d0: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
30e0: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
30f0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
3100: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
3110: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
3120: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
3130: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
3140: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
3150: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
3160: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
3170: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
3180: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
3190: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
31a0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
31b0: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
31c0: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
31d0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
31e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
31f0: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
3200: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
3210: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
3220: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3230: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
3240: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
3250: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
3260: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
3270: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
3280: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
3290: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
32a0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
32c0: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
32d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
32e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
3310: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
3320: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
3330: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
3340: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
3350: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
3360: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
3370: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
3380: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3390: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
33a0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
33b0: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
33c0: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
33d0: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
33e0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
33f0: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
3400: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
3410: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
3420: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
3430: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3440: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
3450: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
3460: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
3470: 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  ER(pLeftTab==0 |
3480: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20  | pRightTab==0) 
3490: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
34a0: 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68  isOuter = (pRigh
34b0: 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  t->fg.jointype &
34c0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
34d0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
34e0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
34f0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
3500: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
3510: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
3520: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
3530: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
3540: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
3550: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3560: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3570: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
3580: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
3590: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
35a0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
35b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
35c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
35d0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
35e0: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
35f0: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
3600: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
3610: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
3620: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
3630: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3640: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
3650: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
3660: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
3670: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
3680: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
3690: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
36a0: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
36b0: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
36c0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
36d0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
36e0: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
36f0: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
3700: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
3710: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
3720: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
3730: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
3740: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3750: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3760: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3770: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
3780: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3790: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
37a0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
37b0: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
37d0: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
37e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3800: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
3810: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
3820: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
3830: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
3840: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3850: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
3860: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
3870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3880: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3890: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
38a0: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
38b0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
38c0: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
38d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
38e0: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
38f0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
3900: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
3910: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
3920: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
3930: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
3940: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3950: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
3960: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
3970: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
3980: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3990: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
39a0: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
39b0: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
39c0: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
39d0: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
39e0: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
39f0: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
3a00: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
3a10: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
3a20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
3a30: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
3a40: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
3a50: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
3a60: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
3a70: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
3a80: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3a90: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3aa0: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3ab0: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3ac0: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3ad0: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3ae0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3af0: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
3b00: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
3b10: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
3b20: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
3b30: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
3b40: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
3b50: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3b60: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3b70: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3b80: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3b90: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3ba0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3bb0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3bc0: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3bd0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3be0: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3bf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3c00: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
3c10: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
3c20: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
3c30: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
3c40: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3c50: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3c60: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3c70: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3c80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c90: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3ca0: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3cb0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3cc0: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3cd0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3ce0: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3cf0: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
3d00: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
3d10: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
3d20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
3d30: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
3d40: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
3d50: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3d60: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3d70: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3d80: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3d90: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3da0: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3db0: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3dc0: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3dd0: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3de0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3df0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3e00: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
3e10: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
3e20: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
3e30: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
3e40: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
3e50: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3e60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3e80: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3e90: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3ea0: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3eb0: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3ee0: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3ef0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3f00: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
3f10: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3f20: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
3f30: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
3f40: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
3f50: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3f60: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3f70: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
3f80: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
3f90: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
3fa0: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
3fb0: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
3fc0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
3fd0: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
3fe0: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
3ff0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
4000: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
4010: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
4020: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
4030: 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a  he end */.);../*
4040: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
4050: 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  e that will push
4060: 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72   the record in r
4070: 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74 61  egisters regData
4080: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67 44  .** through regD
4090: 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f  ata+nData-1 onto
40a0: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
40b0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
40c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
40d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
40e0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
40f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
4100: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
4110: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
4120: 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  n about the ORDE
4130: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
4140: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
4150: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
4160: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
4170: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
4180: 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  egData,         
4190: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
41a0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
41b0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
41c0: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  .  int nData,   
41d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
41e0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
41f0: 69 6e 20 74 68 65 20 64 61 74 61 20 61 72 72 61  in the data arra
4200: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  y */.  int nPref
4210: 69 78 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a  ixReg         /*
4220: 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69 6f   No. of reg prio
4230: 72 20 74 6f 20 72 65 67 44 61 74 61 20 61 76 61  r to regData ava
4240: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a  ilable for use *
4250: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
4260: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74 20          /* Stmt 
4290: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
42a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71  on */.  int bSeq
42b0: 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74   = ((pSort->sort
42c0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
42d0: 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b  _UseSorter)==0);
42e0: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70  .  int nExpr = p
42f0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
4300: 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
4310: 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52      /* No. of OR
4320: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
4330: 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45    int nBase = nE
4340: 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44 61  xpr + bSeq + nDa
4350: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
4360: 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20     /* Fields in 
4370: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
4380: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72 20      /* Regs for 
43c0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
43d0: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
43e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
43f0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4400: 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64      /* Assembled
4410: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4420: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d  /.  int nOBSat =
4430: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20   pSort->nOBSat; 
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
4460: 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a   terms to skip *
4470: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
44a0: 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72   to add sorter r
44b0: 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20  ecord to sorter 
44c0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53  */..  assert( bS
44d0: 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31  eq==0 || bSeq==1
44e0: 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69   );.  if( nPrefi
44f0: 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65  xReg ){.    asse
4500: 72 74 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  rt( nPrefixReg==
4510: 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20  nExpr+bSeq );.  
4520: 20 20 72 65 67 42 61 73 65 20 3d 20 72 65 67 44    regBase = regD
4530: 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53  ata - nExpr - bS
4540: 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eq;.  }else{.   
4550: 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
4560: 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
4570: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
4580: 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20 73 71   nBase;.  }.  sq
4590: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
45a0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
45b0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72  ort->pOrderBy, r
45c0: 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 45  egBase, SQLITE_E
45d0: 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66 28 20  CEL_DUP);.  if( 
45e0: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
45f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4600: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4610: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4620: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
4630: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
4640: 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Reg==0 ){.    sq
4650: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
4660: 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74  e(pParse, regDat
4670: 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  a, regBase+nExpr
4680: 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20  +bSeq, nData);. 
4690: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
46a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
46b0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
46c0: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
46d0: 6e 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f 72  nOBSat, regRecor
46e0: 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61 74  d);.  if( nOBSat
46f0: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  >0 ){.    int re
4700: 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54  gPrevKey;   /* T
4710: 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20  he first nOBSat 
4720: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70  columns of the p
4730: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
4740: 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74     int addrFirst
4750: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
4760: 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20  of the OP_IfNot 
4770: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  opcode */.    in
4780: 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20  t addrJmp;      
4790: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
47a0: 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65  e OP_Jump opcode
47b0: 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   */.    VdbeOp *
47c0: 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63  pOp;      /* Opc
47d0: 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74  ode that opens t
47e0: 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
47f0: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
4800: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4810: 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75  sorting key colu
4820: 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f  mns, including O
4830: 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  P_Sequence */.  
4840: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20    KeyInfo *pKI; 
4850: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
4860: 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73  KeyInfo on the s
4870: 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a  orter table */..
4880: 20 20 20 20 72 65 67 50 72 65 76 4b 65 79 20 3d      regPrevKey =
4890: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
48a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
48b0: 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  m += pSort->nOBS
48c0: 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e  at;.    nKey = n
48d0: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f  Expr - pSort->nO
48e0: 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20 20  BSat + bSeq;.   
48f0: 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20   if( bSeq ){.   
4900: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
4910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4920: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
4930: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20  gBase+nExpr); . 
4940: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4950: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
4960: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4970: 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74   OP_SequenceTest
4980: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
4990: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
49a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
49b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
49c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
49d0: 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20  re, regPrevKey, 
49e0: 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e  regBase, pSort->
49f0: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f 70  nOBSat);.    pOp
4a00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4a10: 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64  tOp(v, pSort->ad
4a20: 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
4a30: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
4a40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4a50: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70   return;.    pOp
4a60: 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44  ->p2 = nKey + nD
4a70: 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70  ata;.    pKI = p
4a80: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
4a90: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d  .    memset(pKI-
4aa0: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  >aSortOrder, 0, 
4ab0: 70 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a  pKI->nField); /*
4ac0: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62   Makes OP_Jump b
4ad0: 65 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f  elow testable */
4ae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4af0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
4b00: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
4b10: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
4b20: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 58 46 69  tcase( pKI->nXFi
4b30: 65 6c 64 3e 32 20 29 3b 0a 20 20 20 20 70 4f 70  eld>2 );.    pOp
4b40: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20  ->p4.pKeyInfo = 
4b50: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
4b60: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4b70: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42  t->pOrderBy, nOB
4b80: 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Sat,.           
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 2d 31 29 3b  pKI->nXField-1);
4bc0: 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73  .    addrJmp = s
4bd0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
4be0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
4bf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4c00: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
4c10: 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d  Jmp+1, 0, addrJm
4c20: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
4c30: 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  ge(v);.    pSort
4c40: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73  ->labelBkOut = s
4c50: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4c60: 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72  bel(v);.    pSor
4c70: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  t->regReturn = +
4c80: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
4c90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4ca0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
4cb0: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
4cc0: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
4cd0: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
4ce0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4cf0: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
4d00: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4d10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4d20: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4d30: 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71  drFirst);.    sq
4d40: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
4d50: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
4d60: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70  e, regPrevKey, p
4d70: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20  Sort->nOBSat);. 
4d80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4d90: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d  mpHere(v, addrJm
4da0: 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  p);.  }.  if( pS
4db0: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
4dc0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
4dd0: 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ter ){.    op = 
4de0: 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b  OP_SorterInsert;
4df0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
4e00: 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b   = OP_IdxInsert;
4e10: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4e20: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
4e30: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4e40: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69   regRecord);.  i
4e50: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  f( pSelect->iLim
4e60: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
4e70: 64 72 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  dr;.    int iLim
4e80: 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  it;.    if( pSel
4e90: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ect->iOffset ){.
4ea0: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
4eb0: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
4ec0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
4ed0: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
4ee0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  lect->iLimit;.  
4ef0: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
4f00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4f10: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  (v, OP_IfNotZero
4f20: 2c 20 69 4c 69 6d 69 74 2c 20 30 2c 20 2d 31 29  , iLimit, 0, -1)
4f30: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4f40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4f50: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c  beAddOp1(v, OP_L
4f60: 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ast, pSort->iECu
4f70: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4f80: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4f90: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74  OP_Delete, pSort
4fa0: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4fc0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
4fd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
4fe0: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
4ff0: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
5000: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
5010: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
5020: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
5030: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
5040: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
5050: 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20  nt iOffset,     
5060: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
5070: 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20  ding the offset 
5080: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5090: 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f   iContinue     /
50a0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
50b0: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
50c0: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
50d0: 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a  f( iOffset>0 ){.
50e0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
50f0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
5100: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5110: 5f 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c  _IfNeg, iOffset,
5120: 20 30 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76   0, -1); VdbeCov
5130: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5150: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
5160: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
5170: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5180: 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f  skip OFFSET reco
5190: 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  rds"));.    sqli
51a0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
51b0: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
51c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
51d0: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
51e0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
51f0: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
5200: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
5210: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
5220: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
5230: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
5240: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
5250: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
5260: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
5270: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
5280: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
5290: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
52a0: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
52b0: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
52c0: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
52d0: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
52e0: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
52f0: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
5300: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
5310: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
5320: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
5330: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
5340: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
5350: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
5360: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
5370: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5380: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5390: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
53a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
53b0: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
53c0: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
53d0: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
53e0: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
53f0: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
5400: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
5410: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
5420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5430: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
5440: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
5450: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
5460: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
5470: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
5480: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
5490: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
54a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
54b0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
54c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
54d0: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
54e0: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
54f0: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62  t, iMem, N); Vdb
5500: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5520: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5530: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
5540: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5550: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
5560: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29  nsert, iTab, r1)
5570: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
5580: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5590: 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  , r1);.}..#ifnde
55a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
55b0: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
55c0: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
55d0: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
55e0: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
55f0: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
5600: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
5610: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
5620: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
5630: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
5640: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
5650: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
5660: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
5670: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
5680: 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f   error used to o
5690: 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69  ccur.** in multi
56a0: 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68  ple places.  (Th
56b0: 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63  e error only occ
56c0: 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65  urs in one place
56d0: 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20   now, but we.** 
56e0: 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f  retain the subro
56f0: 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a  utine to minimiz
5700: 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f  e code disruptio
5710: 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  n.).*/.static in
5720: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
5730: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
5740: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5750: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
5760: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
5770: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5780: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
5790: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
57a0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
57b0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
57c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
57d0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
57e0: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
57f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
5800: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
5810: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
5820: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
5830: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
5840: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
5850: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5860: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
5870: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
5880: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
5890: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
58a0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
58b0: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
58c0: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
58d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
58e0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
58f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5900: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
5910: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
5920: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
5930: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
5940: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
5950: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
5960: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
5970: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
5980: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
5990: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
59a0: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
59b0: 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20  row.  If srcTab 
59c0: 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  is.** zero or mo
59d0: 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73  re, then data is
59e0: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
59f0: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
5a00: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
5a10: 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f  to get number co
5a20: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61  lumns and the da
5a30: 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20  tatype for each 
5a40: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
5a50: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
5a60: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
5a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5a80: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5a90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
5aa0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
5ab0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5ac0: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
5ad0: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
5ae0: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
5af0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
5b00: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
5b10: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
5b20: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
5b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5b40: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
5b50: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
5b60: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
5b70: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
5b80: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
5b90: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f  how to process O
5ba0: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73  RDER BY */.  Dis
5bb0: 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69  tinctCtx *pDisti
5bc0: 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  nct, /* If not N
5bd0: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
5be0: 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54   to process DIST
5bf0: 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74  INCT */.  Select
5c00: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
5c10: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
5c20: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
5c30: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
5c40: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
5c50: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
5c60: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
5c70: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
5c80: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
5c90: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5ca0: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
5cb0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5cc0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5cd0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5ce0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5cf0: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
5d00: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5d10: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
5d20: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
5d30: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
5d40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5d50: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
5d60: 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  ry holding resul
5d70: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65  t set */.  int e
5d80: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
5d90: 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f  est;   /* How to
5da0: 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75   dispose of resu
5db0: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
5dc0: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
5dd0: 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72  arm; /* First ar
5de0: 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73  gument to dispos
5df0: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
5e00: 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20  nt nResultCol;  
5e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5e20: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
5e30: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
5e40: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20  nPrefixReg = 0; 
5e50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5e60: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
5e70: 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52  ters before regR
5e80: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esult */..  asse
5e90: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
5ea0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
5eb0: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
5ec0: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
5ed0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
5ee0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
5ef0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
5f00: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
5f10: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
5f20: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
5f30: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
5f40: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
5f50: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
5f60: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
5f70: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
5f80: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
5f90: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
5fa0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
5fb0: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
5fc0: 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ultCol = pEList-
5fd0: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
5fe0: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
5ff0: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
6000: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
6010: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
6020: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
6030: 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d      if( !(pSort-
6040: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
6050: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
6060: 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b   ) nPrefixReg++;
6070: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
6080: 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65  Mem += nPrefixRe
6090: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65  g;.    }.    pDe
60a0: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
60b0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
60c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
60d0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
60e0: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
60f0: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
6100: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
6110: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
6120: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
6130: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
6140: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
6150: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
6160: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
6170: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
6180: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
6190: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
61a0: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
61b0: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
61c0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
61d0: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
61e0: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
61f0: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
6200: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
6210: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
6220: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
6230: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
6240: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
6250: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
6260: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
6270: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
6280: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
6290: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
62a0: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
62b0: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
62c0: 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74  Col;.  regResult
62d0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
62e0: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
62f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6300: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6310: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6320: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6330: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
6340: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
6350: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
6360: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
6370: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
6380: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
6390: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
63a0: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
63b0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
63c0: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
63d0: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
63e0: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
63f0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
6400: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
6410: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
6420: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
6430: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a    u8 ecelFlags;.
6440: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
6450: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
6460: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
6470: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
6480: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65  ine ){.      ece
6490: 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  lFlags = SQLITE_
64a0: 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65  ECEL_DUP;.    }e
64b0: 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46  lse{.      ecelF
64c0: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lags = 0;.    }.
64d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
64e0: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
64f0: 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52  se, pEList, regR
6500: 65 73 75 6c 74 2c 20 65 63 65 6c 46 6c 61 67 73  esult, ecelFlags
6510: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
6520: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
6530: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
6540: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
6550: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
6560: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
6570: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
6580: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
6590: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
65a0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
65b0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
65c0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
65d0: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
65e0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
65f0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
6600: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
6610: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
6620: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
6630: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
6640: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
6650: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
6660: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
6670: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
6680: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
6690: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
66a0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
66c0: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
66d0: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
66e0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
66f0: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
6700: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
6710: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
6720: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6730: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
6740: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
6750: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
6760: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
6770: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
6780: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
6790: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
67a0: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
67b0: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
67c0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
67d0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
67e0: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
67f0: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
6800: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
6810: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
6820: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
6830: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
6840: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
6850: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
6860: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
6870: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
6880: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
6890: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
68a0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
68b0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
68c0: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
68d0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
68e0: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
68f0: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
6900: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
6910: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
6920: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
6930: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
6940: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
6950: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
6960: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6970: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
6980: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
6990: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
69a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
69b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
69c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
69d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69  Seq(pParse, pELi
69e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
69f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
6a00: 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b  <nResultCol-1 ){
6a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6a20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6a30: 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75  , OP_Ne, regResu
6a40: 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67  lt+i, iJump, reg
6a50: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
6a60: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
6a70: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
6a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6a90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6aa0: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
6ab0: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e  egResult+i, iCon
6ac0: 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69  tinue, regPrev+i
6ad0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
6ae0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6af0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6b00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6b10: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
6b20: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
6b30: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
6b40: 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
6b50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6b60: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
6b70: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
6b80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
6b90: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
6ba0: 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
6bb0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
6bc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6bd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6be0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
6bf0: 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  opy, regResult, 
6c00: 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74  regPrev, nResult
6c10: 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
6c20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
6c30: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
6c40: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
6c50: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
6c60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
6c70: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
6c80: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
6c90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6ca0: 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
6cb0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73  lt: {.        as
6cc0: 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d  sert( pDistinct-
6cd0: 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  >eTnctType==WHER
6ce0: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
6cf0: 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  ERED );.        
6d00: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
6d10: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  rse, pDistinct->
6d20: 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  tabTnct, iContin
6d30: 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ue, nResultCol,.
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b       regResult);
6d60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6d80: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29    if( pSort==0 )
6d90: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
6da0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
6db0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
6dc0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
6dd0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
6de0: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
6df0: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
6e00: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
6e10: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
6e20: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
6e30: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
6e40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6e50: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
6e60: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
6e70: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
6e80: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
6e90: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
6ea0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
6eb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ec0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
6ed0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
6ee0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
6ef0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
6f00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6f10: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
6f20: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
6f30: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6f40: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6f50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6f60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
6f70: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
6f80: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
6f90: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
6fa0: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
6fb0: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
6fc0: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
6fd0: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
6fe0: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
6ff0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
7000: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
7010: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
7020: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
7030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7040: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
7050: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
7060: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
7070: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7080: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
7090: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
70a0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  ND_SELECT */..  
70b0: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
70c0: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
70d0: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
70e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
70f0: 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20  e SRT_Fifo:.    
7100: 63 61 73 65 20 53 52 54 5f 44 69 73 74 46 69 66  case SRT_DistFif
7110: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
7120: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
7130: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
7140: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
7150: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
7160: 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66  ge(pParse, nPref
7170: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
7180: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7190: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
71a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
71b0: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
71c0: 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  b );.      testc
71d0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
71e0: 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 74 65  Fifo );.      te
71f0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7200: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
7210: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7220: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
7230: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
7240: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
7250: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  r1+nPrefixReg);.
7260: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7270: 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66  MIT_CTE.      if
7280: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
7290: 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  tFifo ){.       
72a0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
72b0: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69  nation is DistFi
72c0: 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  fo, then cursor 
72d0: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
72e0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
72f0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
7300: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
7310: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
7320: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
7330: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
7340: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
7350: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
7360: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
7370: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
7380: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
7390: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
73a0: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
73b0: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
73c0: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
73d0: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
73e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
73f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
7400: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
7410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7420: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
7430: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
7440: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
7450: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
7460: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7480: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
7490: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
74a0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
74b0: 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20  t( pSort==0 );. 
74c0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
74d0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
74e0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
74f0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
7500: 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72  pSort, p, r1+nPr
7510: 65 66 69 78 52 65 67 2c 20 31 2c 20 6e 50 72 65  efixReg, 1, nPre
7520: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
7530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
7540: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
7550: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7560: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7570: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7580: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
7590: 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  m, r2);.        
75a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
75b0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
75c0: 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
75d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
75e0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
75f0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
7600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
7610: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
7620: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
7630: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
7640: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
7650: 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65  pParse, r1, nPre
7660: 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20  fixReg+1);.     
7670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
7680: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7690: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
76a0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
76b0: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
76c0: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
76d0: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
76e0: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
76f0: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
7700: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
7710: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
7720: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
7730: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
7740: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
7750: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
7760: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
7770: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
7780: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
7790: 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
77a0: 61 66 66 53 64 73 74 20 3d 0a 20 20 20 20 20 20  affSdst =.      
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
77c0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
77d0: 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ty(pEList->a[0].
77e0: 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
77f0: 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 69 66  fSdst);.      if
7800: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
7810: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
7820: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
7830: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
7840: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
7850: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
7860: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
7870: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
7880: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
7890: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
78a0: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
78b0: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
78c0: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
78d0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
78e0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
78f0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
7900: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
7910: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7920: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
7930: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20  , regResult, 1, 
7940: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7950: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7960: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
7970: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7980: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
7990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
79a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
79b0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 31 2c 72 31  , regResult,1,r1
79c0: 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73  , &pDest->affSds
79d0: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 1);.        s
79e0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
79f0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
7a00: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
7a10: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
7a20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7a30: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
7a40: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
7a50: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
7a60: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
7a70: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r1);.      }. 
7a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7a90: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  }..    /* If any
7aa0: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
7ab0: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
7ac0: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
7ad0: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
7ae0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
7af0: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
7b00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7b10: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
7b20: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
7b30: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
7b40: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
7b50: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
7b60: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
7b70: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7b80: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
7b90: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
7ba0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
7bb0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
7bc0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
7bd0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
7be0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
7bf0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
7c00: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
7c10: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
7c20: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7c30: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
7c40: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
7c50: 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  ol==1 );.      i
7c60: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7c70: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
7c80: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
7c90: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
7ca0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  1, nPrefixReg);.
7cb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7cc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
7cd0: 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b  Result==iParm );
7ce0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
7cf0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
7d00: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
7d10: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7d20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7d30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
7d40: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
7d50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7d60: 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20  RY */..    case 
7d70: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20  SRT_Coroutine:  
7d80: 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74       /* Send dat
7d90: 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e  a to a co-routin
7da0: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52  e */.    case SR
7db0: 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20  T_Output: {     
7dc0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
7dd0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
7de0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7df0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
7e00: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7e10: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
7e20: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
7e30: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7e40: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
7e50: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
7e60: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
7e70: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
7e80: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
7e90: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
7ea0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
7eb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7ec0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
7ed0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
7ee0: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
7ef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
7f00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7f10: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
7f20: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
7f30: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
7f40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
7f50: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
7f60: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
7f70: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
7f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7f90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
7fa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7fb0: 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  CTE.    /* Write
7fc0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74   the results int
7fd0: 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71 75 65  o a priority que
7fe0: 75 65 20 74 68 61 74 20 69 73 20 6f 72 64 65 72  ue that is order
7ff0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20   according to.  
8000: 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64    ** pDest->pOrd
8010: 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20  erBy (in pSO).  
8020: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28  pDest->iSDParm (
8030: 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68 65  in iParm) is the
8040: 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20   cursor for an. 
8050: 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68     ** index with
8060: 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f   pSO->nExpr+2 co
8070: 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20  lumns.  Build a 
8080: 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f  key using pSO fo
8090: 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  r the first.    
80a0: 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f  ** pSO->nExpr co
80b0: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65  lumns, then make
80c0: 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61   sure all keys a
80d0: 72 65 20 75 6e 69 71 75 65 20 62 79 20 61 64 64  re unique by add
80e0: 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e  ing a.    ** fin
80f0: 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63  al OP_Sequence c
8100: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74  olumn.  The last
8110: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72   column is the r
8120: 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e  ecord as a blob.
8130: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
8140: 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a   SRT_DistQueue:.
8150: 20 20 20 20 63 61 73 65 20 53 52 54 5f 51 75 65      case SRT_Que
8160: 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ue: {.      int 
8170: 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  nKey;.      int 
8180: 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20  r1, r2, r3;.    
8190: 20 20 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d    int addrTest =
81a0: 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   0;.      ExprLi
81b0: 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70  st *pSO;.      p
81c0: 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64  SO = pDest->pOrd
81d0: 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65  erBy;.      asse
81e0: 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20  rt( pSO );.     
81f0: 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78   nKey = pSO->nEx
8200: 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  pr;.      r1 = s
8210: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
8220: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
8230: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
8240: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
8250: 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20   nKey+2);.      
8260: 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a  r3 = r2+nKey+1;.
8270: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
8280: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
8290: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
82a0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
82b0: 69 73 20 44 69 73 74 51 75 65 75 65 2c 20 74 68  is DistQueue, th
82c0: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
82d0: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
82e0: 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f      ** on a seco
82f0: 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  nd ephemeral ind
8300: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c  ex that holds al
8310: 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79 20 70  l values every p
8320: 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20  reviously.      
8330: 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68    ** added to th
8340: 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20  e queue. */.    
8350: 20 20 20 20 61 64 64 72 54 65 73 74 20 3d 20 73      addrTest = s
8360: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8370: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
8380: 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20   iParm+1, 0, .  
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c        regResult,
83c0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
83d0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
83e0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
83f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8400: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
8410: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
8420: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
8430: 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  r3);.      if( e
8440: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8450: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eue ){.        s
8460: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8470: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
8480: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a  , iParm+1, r3);.
8490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
84a0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
84b0: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
84c0: 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULT);.      }.  
84d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
84e0: 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Key; i++){.     
84f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8500: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
8510: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8520: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
8530: 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69  esult + pSO->a[i
8540: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
8550: 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20  l - 1,.         
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a   r2+i);.      }.
8580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8590: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
85a0: 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72  quence, iParm, r
85b0: 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73  2+nKey);.      s
85c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
85d0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
85e0: 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72  d, r2, nKey+2, r
85f0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8600: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8610: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
8620: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69  rm, r1);.      i
8630: 66 28 20 61 64 64 72 54 65 73 74 20 29 20 73 71  f( addrTest ) sq
8640: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
8650: 65 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b 0a  e(v, addrTest);.
8660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
8670: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
8680: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
8690: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
86a0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
86b0: 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  2, nKey+2);.    
86c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
86d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
86e0: 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23  OMIT_CTE */....#
86f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8700: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
8710: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
8720: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
8730: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
8740: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
8750: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
8760: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
8770: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
8780: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
8790: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
87a0: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
87b0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
87c0: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
87d0: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
87e0: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
87f0: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
8800: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
8810: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
8820: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
8830: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
8840: 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20  T_Discard );.   
8850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8860: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
8870: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
8880: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
8890: 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
88a0: 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ched.  Except, i
88b0: 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  f.  ** there is 
88c0: 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69  a sorter, in whi
88d0: 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74  ch case the sort
88e0: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c  er has already l
88f0: 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  imited.  ** the 
8900: 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20  output for us.. 
8910: 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   */.  if( pSort=
8920: 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20  =0 && p->iLimit 
8930: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
8940: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
8950: 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e  ecrJumpZero, p->
8960: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
8970: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8980: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
8990: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
89a0: 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69  o object suffici
89b0: 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ent for an index
89c0: 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e   of N key column
89d0: 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61  s and.** X extra
89e0: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79   columns..*/.Key
89f0: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
8a00: 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65  InfoAlloc(sqlite
8a10: 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e  3 *db, int N, in
8a20: 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  t X){.  KeyInfo 
8a30: 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  *p = sqlite3DbMa
8a40: 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20  llocZero(0, .   
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a60: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
8a70: 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  + (N+X)*(sizeof(
8a80: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
8a90: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
8aa0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
8ab0: 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58  8*)&p->aColl[N+X
8ac0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64  ];.    p->nField
8ad0: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
8ae0: 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36  ->nXField = (u16
8af0: 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d  )X;.    p->enc =
8b00: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d   ENC(db);.    p-
8b10: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
8b20: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >nRef = 1;.  }el
8b30: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  se{.    db->mall
8b40: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
8b50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
8b60: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
8b70: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
8b80: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
8b90: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b  e3KeyInfoUnref(K
8ba0: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
8bb0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
8bc0: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
8bd0: 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20      p->nRef--;. 
8be0: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
8bf0: 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  0 ) sqlite3DbFre
8c00: 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(0, p);.  }.}..
8c10: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77  /*.** Make a new
8c20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
8c30: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
8c40: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
8c50: 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e  KeyInfoRef(KeyIn
8c60: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
8c70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8c80: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
8c90: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  p->nRef++;.  }. 
8ca0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69   return p;.}..#i
8cb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8cc0: 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  G./*.** Return T
8cd0: 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f  RUE if a KeyInfo
8ce0: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63   object can be c
8cf0: 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49  hange.  The KeyI
8d00: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61  nfo object.** ca
8d10: 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65  n only be change
8d20: 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  d if this is jus
8d30: 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72  t a single refer
8d40: 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65  ence to the obje
8d50: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ct..**.** This r
8d60: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
8d70: 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73  nly inside of as
8d80: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
8d90: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
8da0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
8db0: 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ble(KeyInfo *p){
8dc0: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d   return p->nRef=
8dd0: 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =1; }.#endif /* 
8de0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
8df0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
8e00: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
8e10: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
8e20: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
8e30: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
8e40: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8e50: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
8e60: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
8e70: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8e80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
8e90: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
8ea0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
8eb0: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
8ec0: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
8ed0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8ee0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
8ef0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
8f00: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
8f10: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
8f20: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
8f30: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
8f40: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
8f50: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
8f60: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
8f70: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
8f80: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
8f90: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
8fa0: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
8fb0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
8fc0: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
8fd0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
8fe0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
8ff0: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
9000: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
9010: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
9020: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
9030: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
9040: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
9050: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
9060: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
9070: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
9080: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
9090: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
90a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
90b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
90c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
90d0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
90e0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
90f0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
9100: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
9110: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
9120: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
9130: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
9140: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
9150: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
9160: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
9170: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
9180: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a  o the end */.){.
9190: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
91a0: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
91b0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
91c0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
91d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
91e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
91f0: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
9200: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
9210: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
9220: 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
9230: 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78 74  xpr-iStart, nExt
9240: 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49 6e  ra+1);.  if( pIn
9250: 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  fo ){.    assert
9260: 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
9270: 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66  IsWriteable(pInf
9280: 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  o) );.    for(i=
9290: 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c  iStart, pItem=pL
92a0: 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69  ist->a+iStart; i
92b0: 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  <nExpr; i++, pIt
92c0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c  em++){.      Col
92d0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
92e0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
92f0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
9300: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
9310: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  pr);.      if( !
9320: 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
9330: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
9340: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
9350: 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 43  l[i-iStart] = pC
9360: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
9370: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69  ->aSortOrder[i-i
9380: 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e  Start] = pItem->
9390: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
93a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
93b0: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61  nfo;.}../*.** Na
93c0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
93d0: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
93e0: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
93f0: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
9400: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
9410: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
9420: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
9430: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
9440: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
9450: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
9460: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
9470: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
9480: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
9490: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
94a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
94b0: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
94c0: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
94d0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
94e0: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
94f0: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
9500: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
9510: 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  z;.}..#ifndef SQ
9520: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
9530: 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  N./*.** Unless a
9540: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
9550: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
9560: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
9570: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
9580: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
9590: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
95a0: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
95b0: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
95c0: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
95d0: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
95e0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
95f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54  :.**.**   "USE T
9600: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78  EMP B-TREE FOR x
9610: 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  xx".**.** where 
9620: 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44  xxx is one of "D
9630: 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52  ISTINCT", "ORDER
9640: 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42   BY" or "GROUP B
9650: 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63  Y". Exactly whic
9660: 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e  h.** is determin
9670: 65 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65  ed by the zUsage
9680: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
9690: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
96a0: 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65  nTempTable(Parse
96b0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
96c0: 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20  char *zUsage){. 
96d0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
96e0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
96f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9700: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
9710: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
9720: 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
9730: 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d  db, "USE TEMP B-
9740: 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55  TREE FOR %s", zU
9750: 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  sage);.    sqlit
9760: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
9770: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
9780: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
9790: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
97a0: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
97b0: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72  *.** Assign expr
97c0: 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c  ession b to lval
97d0: 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20  ue a. A second, 
97e0: 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f  no-op, version o
97f0: 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20  f this macro.** 
9800: 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e  is provided when
9810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
9820: 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e  LAIN is defined.
9830: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
9840: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69   code.** in sqli
9850: 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61  te3Select() to a
9860: 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20  ssign values to 
9870: 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72  structure member
9880: 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a   variables that.
9890: 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66  ** only exist if
98a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
98b0: 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69  LAIN is not defi
98c0: 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c  ned without poll
98d0: 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64  uting the.** cod
98e0: 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64  e with #ifndef d
98f0: 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20  irectives..*/.# 
9900: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
9910: 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61  tInteger(a, b) a
9920: 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e   = b..#else./* N
9930: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
9940: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
9950: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
9960: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
9970: 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  ine explainTempT
9980: 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69  able(y,z).# defi
9990: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
99a0: 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66  eger(y,z).#endif
99b0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
99c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
99d0: 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  IN) && !defined(
99e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
99f0: 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a  OUND_SELECT)./*.
9a00: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
9a10: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
9a20: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
9a30: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
9a40: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
9a50: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
9a60: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
9a70: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
9a80: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
9a90: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
9aa0: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
9ab0: 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77  of one of the tw
9ac0: 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20  o forms:.**.**  
9ad0: 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51   "COMPOSITE SUBQ
9ae0: 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64  UERIES iSub1 and
9af0: 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20   iSub2 (op)".** 
9b00: 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42    "COMPOSITE SUB
9b10: 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e  QUERIES iSub1 an
9b20: 64 20 69 53 75 62 32 20 55 53 49 4e 47 20 54 45  d iSub2 USING TE
9b30: 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a  MP B-TREE (op)".
9b40: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62  **.** where iSub
9b50: 31 20 61 6e 64 20 69 53 75 62 32 20 61 72 65 20  1 and iSub2 are 
9b60: 74 68 65 20 69 6e 74 65 67 65 72 73 20 70 61 73  the integers pas
9b70: 73 65 64 20 61 73 20 74 68 65 20 63 6f 72 72 65  sed as the corre
9b80: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63  sponding.** func
9b90: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c  tion parameters,
9ba0: 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74   and op is the t
9bb0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
9bc0: 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  on of the parame
9bd0: 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  ter.** of the sa
9be0: 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72  me name. The par
9bf0: 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74  ameter "op" must
9c00: 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e   be one of TK_UN
9c10: 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a  ION, TK_EXCEPT,.
9c20: 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  ** TK_INTERSECT 
9c30: 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66  or TK_ALL. The f
9c40: 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65  irst form is use
9c50: 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55  d if argument bU
9c60: 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c  seTmp is .** fal
9c70: 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e  se, or the secon
9c80: 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20  d form if it is 
9c90: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
9ca0: 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70  void explainComp
9cb0: 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a  osite(.  Parse *
9cc0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
9cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9ce0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  e context */.  i
9cf0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d10: 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  * One of TK_UNIO
9d20: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63  N, TK_EXCEPT etc
9d30: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31  . */.  int iSub1
9d40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9d50: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
9d60: 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74  ry id 1 */.  int
9d70: 20 69 53 75 62 32 2c 20 20 20 20 20 20 20 20 20   iSub2,         
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d90: 53 75 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f  Subquery id 2 */
9da0: 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20  .  int bUseTmp  
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
9dd0: 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75  temp table was u
9de0: 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  sed */.){.  asse
9df0: 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e  rt( op==TK_UNION
9e00: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   || op==TK_EXCEP
9e10: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
9e20: 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  RSECT || op==TK_
9e30: 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ALL );.  if( pPa
9e40: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
9e50: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
9e60: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
9e70: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
9e80: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9e90: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
9ea0: 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53  >db, "COMPOUND S
9eb0: 55 42 51 55 45 52 49 45 53 20 25 64 20 41 4e 44  UBQUERIES %d AND
9ec0: 20 25 64 20 25 73 28 25 73 29 22 2c 20 69 53 75   %d %s(%s)", iSu
9ed0: 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20  b1, iSub2,.     
9ee0: 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e     bUseTmp?"USIN
9ef0: 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a  G TEMP B-TREE ":
9f00: 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  "", selectOpName
9f10: 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  (op).    );.    
9f20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f30: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
9f40: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
9f50: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
9f60: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
9f70: 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  .}.#else./* No-o
9f80: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
9f90: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
9fa0: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
9fb0: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
9fc0: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
9fd0: 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  e(v,w,x,y,z).#en
9fe0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
9ff0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73  e inner loop was
a000: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
a010: 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64   a non-null pOrd
a020: 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  erBy argument,.*
a030: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  * then the resul
a040: 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69  ts were placed i
a050: 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74  n a sorter.  Aft
a060: 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74  er the loop is t
a070: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20  erminated.** we 
a080: 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20  need to run the 
a090: 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75  sorter and outpu
a0a0: 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  t the results.  
a0b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  The following.**
a0c0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
a0d0: 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64  es the code need
a0e0: 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ed to do that..*
a0f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
a100: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a  nerateSortTail(.
a110: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a120: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a130: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
a140: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
a150: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
a160: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43  ement */.  SortC
a170: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20  tx *pSort,   /* 
a180: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74  Information on t
a190: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
a1a0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  se */.  int nCol
a1b0: 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d  umn,      /* Num
a1c0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
a1d0: 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  f data */.  Sele
a1e0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a  ctDest *pDest /*
a1f0: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
a200: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
a210: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
a220: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
a250: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
a260: 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b  .  int addrBreak
a270: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
a280: 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20 20  keLabel(v);     
a290: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
a2a0: 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  exit loop */.  i
a2b0: 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20  nt addrContinue 
a2c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
a2d0: 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a  eLabel(v);  /* J
a2e0: 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78  ump here for nex
a2f0: 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
a300: 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64   addr;.  int add
a310: 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74  rOnce = 0;.  int
a320: 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73   iTab;.  ExprLis
a330: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
a340: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  ort->pOrderBy;. 
a350: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
a360: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
a370: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
a380: 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72  iSDParm;.  int r
a390: 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67  egRow;.  int reg
a3a0: 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4b 65  Rowid;.  int nKe
a3b0: 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74 54 61  y;.  int iSortTa
a3c0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
a3d0: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
a3e0: 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72  ursor to read fr
a3f0: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6f 72  om */.  int nSor
a400: 74 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  tData;          
a410: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 69 6c          /* Trail
a420: 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 72 65  ing values to re
a430: 61 64 20 66 72 6f 6d 20 73 6f 72 74 65 72 20 2a  ad from sorter *
a440: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  /.  int i;.  int
a450: 20 62 53 65 71 3b 20 20 20 20 20 20 20 20 20 20   bSeq;          
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a470: 54 72 75 65 20 69 66 20 73 6f 72 74 65 72 20 72  True if sorter r
a480: 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73 20 73  ecord includes s
a490: 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69 66 64 65  eq. no. */.#ifde
a4a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a4b0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
a4c0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
a4d0: 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78 20  st_item *aOutEx 
a4e0: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  = p->pEList->a;.
a4f0: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53  #endif..  if( pS
a500: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20  ort->labelBkOut 
a510: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
a520: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
a530: 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67  osub, pSort->reg
a540: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c  Return, pSort->l
a550: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
a560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a570: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
a580: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
a590: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
a5a0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72  lveLabel(v, pSor
a5b0: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
a5c0: 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53 6f    }.  iTab = pSo
a5d0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20  rt->iECursor;.  
a5e0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
a5f0: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
a600: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
a610: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
a620: 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  0;.    regRow = 
a630: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
a640: 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 6e 43    nSortData = nC
a650: 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  olumn;.  }else{.
a660: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
a670: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a680: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65  (pParse);.    re
a690: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
a6a0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a6b0: 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20  ;.    nSortData 
a6c0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20  = 1;.  }.  nKey 
a6d0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
a6e0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
a6f0: 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  t;.  if( pSort->
a700: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
a710: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
a720: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72  {.    int regSor
a730: 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tOut = ++pParse-
a740: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74  >nMem;.    iSort
a750: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
a760: 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 53  ab++;.    if( pS
a770: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20  ort->labelBkOut 
a780: 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e 63  ){.      addrOnc
a790: 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  e = sqlite3CodeO
a7a0: 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
a7b0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a7c0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
a7d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a7e0: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72  OpenPseudo, iSor
a7f0: 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  tTab, regSortOut
a800: 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61  , nKey+1+nSortDa
a810: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  ta);.    if( add
a820: 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56  rOnce ) sqlite3V
a830: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
a840: 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64  ddrOnce);.    ad
a850: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
a860: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a870: 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61  _SorterSort, iTa
a880: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
a890: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
a8a0: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
a8b0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
a8c0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
a8d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a8e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
a8f0: 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72  terData, iTab, r
a900: 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74  egSortOut, iSort
a910: 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d  Tab);.    bSeq =
a920: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
a930: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
a940: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a950: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
a960: 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
a970: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a980: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
a990: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
a9a0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53  ontinue);.    iS
a9b0: 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ortTab = iTab;. 
a9c0: 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d     bSeq = 1;.  }
a9d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53  .  for(i=0; i<nS
a9e0: 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20  ortData; i++){. 
a9f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aa00: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
aa10: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 6e 4b 65  n, iSortTab, nKe
aa20: 79 2b 62 53 65 71 2b 69 2c 20 72 65 67 52 6f 77  y+bSeq+i, regRow
aa30: 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  +i);.    VdbeCom
aa40: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61  ment((v, "%s", a
aa50: 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f  OutEx[i].zName ?
aa60: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
aa70: 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70   : aOutEx[i].zSp
aa80: 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  an));.  }.  swit
aa90: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
aaa0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
aab0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab: {.      sqli
aac0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
aad0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
aae0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
aaf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ab00: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
ab10: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
ab20: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
ab30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ab40: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
ab50: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
ab60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ab70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ab80: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
ab90: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
aba0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
abb0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
abc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
abd0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
abe0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
abf0: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53      &pDest->affS
ac20: 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
ac30: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
ac40: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
ac50: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
ac60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ac70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ac80: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
ac90: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
aca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
acb0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
acc0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
acd0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
ace0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
acf0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
ad00: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
ad10: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
ad20: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
ad30: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
ad40: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
ad50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ad60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
ad70: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
ad80: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
ad90: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
ada0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
adb0: 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74  e ); .      test
adc0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
add0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
ade0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
adf0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
ae00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
ae10: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
ae20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ae30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ae40: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65  P_ResultRow, pDe
ae50: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
ae60: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
ae70: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
ae80: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
ae90: 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  se, pDest->iSdst
aea0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
aeb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aec0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aed0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
aee0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
aef0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
af00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
af10: 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29    if( regRowid )
af20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
af30: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
af40: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20  se, regRow);.   
af50: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
af60: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
af70: 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  egRowid);.  }.  
af80: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
af90: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
afa0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
afb0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
afc0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
afd0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
afe0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
aff0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
b000: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b010: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
b020: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
b030: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b050: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b060: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
b070: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
b080: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
b090: 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  f( pSort->regRet
b0a0: 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  urn ) sqlite3Vdb
b0b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
b0c0: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67  turn, pSort->reg
b0d0: 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74  Return);.  sqlit
b0e0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
b0f0: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
b100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b110: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
b120: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
b130: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
b140: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
b150: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
b160: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
b170: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
b180: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
b190: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
b1a0: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
b1b0: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
b1c0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
b1d0: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
b1e0: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
b1f0: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
b200: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
b210: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
b220: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
b230: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
b240: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
b250: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
b260: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
b270: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b280: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
b290: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
b2a0: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
b2b0: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
b2c0: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
b2d0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
b2e0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
b2f0: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
b300: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
b310: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
b320: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
b330: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
b340: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
b350: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
b360: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
b370: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
b380: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
b390: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
b3a0: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
b3b0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
b3c0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
b3d0: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
b3e0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
b3f0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
b400: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
b410: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
b420: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
b430: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
b440: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
b450: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
b460: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
b470: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
b480: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
b490: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
b4a0: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
b4b0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
b4c0: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
b4d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
b4e0: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
b4f0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
b500: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
b510: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b520: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b530: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
b540: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
b550: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
b560: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 23 65  (A,B,C,D,E,F).#e
b570: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
b580: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
b590: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b5a0: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
b5b0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
b5c0: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
b5d0: 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 23 65 6e 64  Impl(A,B,F).#end
b5e0: 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  if.static const 
b5f0: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
b600: 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Impl(.  NameCont
b610: 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70  ext *pNC, .  Exp
b620: 72 20 2a 70 45 78 70 72 2c 0a 23 69 66 64 65 66  r *pExpr,.#ifdef
b630: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
b640: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
b650: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
b660: 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20  OrigDb,.  const 
b670: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62  char **pzOrigTab
b680: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b690: 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 23 65 6e 64  *pzOrigCol,.#end
b6a0: 69 66 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  if.  u8 *pEstWid
b6b0: 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  th.){.  char con
b6c0: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
b6d0: 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74   int j;.  u8 est
b6e0: 57 69 64 74 68 20 3d 20 31 3b 0a 23 69 66 64 65  Width = 1;.#ifde
b6f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b700: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
b710: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
b720: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61  rigDb = 0;.  cha
b730: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61  r const *zOrigTa
b740: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
b750: 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  nst *zOrigCol = 
b760: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  0;.#endif..  if(
b770: 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
b780: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
b790: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
b7a0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
b7b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
b7c0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
b7d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
b7e0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
b7f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b800: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
b810: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
b820: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
b830: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
b840: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
b850: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
b860: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
b870: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
b880: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
b890: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
b8a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
b8b0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
b8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
b8d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
b8e0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
b8f0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
b900: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
b910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
b920: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
b930: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
b940: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
b950: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
b960: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
b970: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
b980: 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  b */.      testc
b990: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
b9a0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
b9b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b9c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
b9d0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77  OLUMN );.      w
b9e0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
b9f0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
ba00: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
ba10: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
ba20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
ba30: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
ba40: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
ba50: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
ba60: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
ba70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
ba80: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
ba90: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
baa0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
bab0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
bac0: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
bad0: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
bae0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
baf0: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
bb00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
bb10: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
bb20: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
bb30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f  .        /* At o
bb40: 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75  ne time, code su
bb50: 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65  ch as "SELECT ne
bb60: 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72  w.x" within a tr
bb70: 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20  igger would.    
bb80: 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69      ** cause thi
bb90: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72  s condition to r
bba0: 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c  un.  Since then,
bbb0: 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63   we have restruc
bbc0: 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20  tured how.      
bbd0: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64    ** trigger cod
bbe0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  e is generated a
bbf0: 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69  nd so this condi
bc00: 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  tion is no longe
bc10: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  r .        ** po
bc20: 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c  ssible. However,
bc30: 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65   it can still be
bc40: 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d   true for statem
bc50: 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20  ents like.      
bc60: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
bc70: 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng:.        **. 
bc80: 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41         **   CREA
bc90: 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20  TE TABLE t1(col 
bca0: 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20  INTEGER);.      
bcb0: 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53    **   SELECT (S
bcc0: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52  ELECT t1.col) FR
bcd0: 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  OM FROM t1;.    
bce0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
bcf0: 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  * when columnTyp
bd00: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
bd10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bd20: 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20  "t1.col" in the 
bd30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d  .        ** sub-
bd40: 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20  select. In this 
bd50: 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f  case, set the co
bd60: 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c  lumn type to NUL
bd70: 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20  L, even.        
bd80: 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  ** though it sho
bd90: 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49  uld really be "I
bda0: 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20  NTEGER"..       
bdb0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
bdc0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  his is not a pro
bdd0: 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c  blem, as the col
bde0: 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e  umn type of "t1.
bdf0: 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20  col" is never.  
be00: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57        ** used. W
be10: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
be20: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
be30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20  e expression .  
be40: 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43        ** "(SELEC
be50: 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20  T t1.col)", the 
be60: 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20  correct type is 
be70: 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68  returned (see th
be80: 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20  e TK_SELECT.    
be90: 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65      ** branch be
bea0: 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  low.  */.       
beb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
bec0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bed0: 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54  Tab && pExpr->pT
bee0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
bef0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
bf00: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
bf10: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
bf20: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
bf30: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
bf40: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
bf50: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
bf60: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
bf70: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
bf80: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
bf90: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
bfa0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
bfb0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
bfc0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
bfd0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
bfe0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
bff0: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
c000: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
c010: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
c020: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
c030: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
c040: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
c050: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
c060: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
c070: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
c080: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
c090: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
c0a0: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
c0b0: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
c0c0: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
c0d0: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
c0e0: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
c0f0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c100: 20 20 20 2a 2a 20 54 68 65 20 41 4c 57 41 59 53     ** The ALWAYS
c110: 28 29 20 69 73 20 62 65 63 61 75 73 65 20 69 43  () is because iC
c120: 6f 6c 3e 3d 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  ol>=pS->pEList->
c130: 6e 45 78 70 72 20 77 69 6c 6c 20 68 61 76 65 20  nExpr will have 
c140: 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  been.          *
c150: 2a 20 63 61 75 67 68 74 20 61 6c 72 65 61 64 79  * caught already
c160: 20 62 79 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74   by name resolut
c170: 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ion..          *
c180: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
c190: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c1a0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
c1b0: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
c1c0: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
c1d0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c1e0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c1f0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
c200: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
c210: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c220: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
c230: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c240: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c250: 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72   p,&zOrigDb,&zOr
c260: 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c  igTab,&zOrigCol,
c270: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
c280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
c290: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
c2a0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
c2b0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
c2c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
c2d0: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
c2e0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
c2f0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
c300: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
c310: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
c320: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
c330: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
c340: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c350: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c360: 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28  DATA.        if(
c370: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
c380: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
c390: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
c3a0: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f    zOrigCol = "ro
c3b0: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
c3c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
c3d0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
c3e0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
c3f0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
c400: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
c410: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
c420: 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d        estWidth =
c430: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c440: 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20  ].szEst;.       
c450: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
c460: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
c470: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
c480: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
c490: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
c4a0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
c4b0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
c4c0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
c4d0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
c4e0: 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d    zOrigDb = pNC-
c4f0: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
c500: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
c510: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
c520: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
c540: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c550: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c560: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c570: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c580: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
c590: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
c5a0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
c5b0: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
c5c0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
c5d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c5e0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
c5f0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
c600: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
c610: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
c620: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
c630: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
c640: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
c650: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
c660: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
c670: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
c680: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
c690: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
c6a0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
c6b0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
c6c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
c6d0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c6e0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
c6f0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
c700: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
c710: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
c720: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
c730: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
c740: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
c750: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
c760: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c770: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c780: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
c790: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
c7a0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
c7b0: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
c7c0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c7d0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
c7e0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
c7f0: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
c800: 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  h); .      break
c810: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c820: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
c830: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c840: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
c850: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
c860: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
c870: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
c880: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
c890: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
c8a0: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
c8b0: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
c8c0: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
c8d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
c8e0: 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a  f( pEstWidth ) *
c8f0: 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57  pEstWidth = estW
c900: 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a  idth;.  return z
c910: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
c920: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
c930: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
c940: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
c950: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
c960: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
c970: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
c980: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
c990: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
c9a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c9b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
c9c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
c9d0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
c9e0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
c9f0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
ca00: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
ca10: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
ca20: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
ca30: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
ca40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
ca50: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
ca60: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
ca70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
ca80: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
ca90: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
caa0: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
cab0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
cac0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
cad0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
cae0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
caf0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
cb00: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
cb10: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
cb20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
cb30: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
cb40: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cb50: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
cb60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
cb70: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
cb80: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
cb90: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
cba0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
cbb0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
cbc0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
cbd0: 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20  rigCol, 0);..   
cbe0: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
cbf0: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
cc00: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
cc10: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
cc20: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
cc30: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
cc40: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
cc50: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
cc60: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
cc70: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
cc80: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
cc90: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
cca0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
ccb0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
ccc0: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
ccd0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ccf0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cd00: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
cd10: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
cd20: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
cd30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cd40: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cd50: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
cd60: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
cd70: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
cd80: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
cd90: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
cda0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65   0, 0, 0, 0);.#e
cdb0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
cdc0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cdd0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43  , i, COLNAME_DEC
cde0: 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51  LTYPE, zType, SQ
cdf0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
ce00: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
ce10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ce20: 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f  MIT_DECLTYPE) */
ce30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
ce40: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
ce50: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
ce60: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
ce70: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
ce80: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
ce90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
cea0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
ceb0: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
cec0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
ced0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
cee0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
cef0: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
cf00: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
cf10: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
cf20: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
cf30: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
cf40: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
cf50: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
cf60: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
cf70: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
cf80: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
cf90: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
cfa0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
cfb0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
cfc0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
cfd0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
cfe0: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
cff0: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
d000: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
d010: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
d020: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
d030: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
d040: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
d050: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
d060: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
d070: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
d080: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56  lNamesSet || NEV
d090: 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e  ER(v==0) || db->
d0a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
d0b0: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
d0c0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
d0d0: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
d0e0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d0f0: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
d100: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
d110: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
d120: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
d130: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
d140: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d150: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
d160: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
d170: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d180: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d190: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
d1a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d1b0: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d1c0: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
d1d0: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d1e0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
d1f0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d200: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d210: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
d220: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d230: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d240: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d250: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d260: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d270: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  (p->op==TK_COLUM
d280: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
d290: 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54  GG_COLUMN) && pT
d2a0: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
d2b0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
d2c0: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
d2d0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
d2e0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
d2f0: 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
d300: 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  S(j<pTabList->nS
d310: 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rc); j++){.     
d320: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
d330: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70  >a[j].iCursor==p
d340: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
d350: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d360: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
d370: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
d380: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
d390: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
d3a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
d3b0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
d3c0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
d3d0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
d3e0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
d3f0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
d400: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d410: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
d420: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
d430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d440: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
d450: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
d460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d470: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
d480: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
d490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d4a0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d4b0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d4c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d4d0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d4e0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
d4f0: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
d500: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d510: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
d520: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
d530: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
d540: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
d550: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d560: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
d570: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
d580: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d590: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d5a0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d5b0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
d5c0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d5d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d5e0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d5f0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d600: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
d610: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d620: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d630: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d640: 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e  ar *z = pEList->
d650: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
d660: 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c    z = z==0 ? sql
d670: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d680: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
d690: 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   : sqlite3DbStrD
d6a0: 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  up(db, z);.     
d6b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d6c0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d6d0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51  NAME_NAME, z, SQ
d6e0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
d6f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
d700: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
d710: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
d720: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
d730: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
d740: 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69  ession list (whi
d750: 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  ch is really the
d760: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
d770: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72  ions.** that for
d780: 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  m the result set
d790: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
d7a0: 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20  tement) compute 
d7b0: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63  appropriate.** c
d7c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
d7d0: 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75  a table that wou
d7e0: 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ld hold the expr
d7f0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
d800: 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61  ** All column na
d810: 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71  mes will be uniq
d820: 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ue..**.** Only t
d830: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d840: 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43  are computed.  C
d850: 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c  olumn.zType, Col
d860: 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e  umn.zColl,.** an
d870: 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  d other fields o
d880: 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72  f Column are zer
d890: 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  oed..**.** Retur
d8a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
d8b0: 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65  uccess.  If a me
d8c0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d8d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
d8e0: 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a   store NULL in *
d8f0: 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a  paCol and 0 in *
d900: 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e  pnCol and return
d910: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
d920: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
d930: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
d940: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d950: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
d960: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d970: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
d980: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
d990: 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
d9a0: 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
d9b0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
d9c0: 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
d9d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
d9e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
d9f0: 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
da00: 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
da10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
da20: 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
da30: 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
da40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
da50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
da60: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
da70: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
da80: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
da90: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
daa0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
dab0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
dac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
dad0: 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
dae0: 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
daf0: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
db00: 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
db10: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
db20: 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
db30: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
db40: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
db50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
db60: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
db70: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
db80: 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20   Expr *p;       
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dba0: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61  Expression for a
dbb0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   single result c
dbc0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
dbd0: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
dbe0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
dbf0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
dc00: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
dc10: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
dc20: 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b  f name in zName[
dc30: 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69  ] */..  if( pELi
dc40: 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  st ){.    nCol =
dc50: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
dc60: 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74      aCol = sqlit
dc70: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
dc80: 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30  b, sizeof(aCol[0
dc90: 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65  ])*nCol);.    te
dca0: 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20  stcase( aCol==0 
dcb0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
dcc0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
dcd0: 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  ol = 0;.  }.  *p
dce0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
dcf0: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
dd00: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
dd10: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
dd20: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
dd30: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
dd40: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
dd50: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
dd60: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
dd70: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
dd80: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
dd90: 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61  r);.    if( (zNa
dda0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
ddb0: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
ddc0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
ddd0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
dde0: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
ddf0: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
de00: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
de10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
de20: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
de30: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
de40: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
de50: 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20  *pColExpr = p;  
de60: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
de70: 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65  n that is the re
de80: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
de90: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
dea0: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f  *pTab;         /
deb0: 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74  * Table associat
dec0: 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70  ed with this exp
ded0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
dee0: 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72   while( pColExpr
def0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
df00: 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72          pColExpr
df10: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69   = pColExpr->pRi
df20: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
df30: 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30  ert( pColExpr!=0
df40: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
df50: 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
df60: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
df70: 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72   ALWAYS(pColExpr
df80: 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
df90: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
dfa0: 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c  umns use the col
dfb0: 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f  umn name name */
dfc0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
dfd0: 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43  l = pColExpr->iC
dfe0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
dff0: 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Tab = pColExpr->
e000: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66  pTab;.        if
e010: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
e020: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
e030: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
e040: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
e050: 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20  , "%s",.        
e060: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30           iCol>=0
e070: 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   ? pTab->aCol[iC
e080: 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77  ol].zName : "row
e090: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
e0a0: 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e  e if( pColExpr->
e0b0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
e0c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
e0d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43  prHasProperty(pC
e0e0: 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  olExpr, EP_IntVa
e0f0: 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
e100: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
e110: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
e120: 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f   pColExpr->u.zTo
e130: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
e140: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
e150: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
e160: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
e170: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
e180: 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
e190: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e1a0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e1b0: 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  %s", pEList->a[i
e1c0: 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
e1d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e1e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e1f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e200: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
e210: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
e220: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
e230: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
e240: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
e250: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
e260: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
e270: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
e280: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
e290: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
e2a0: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
e2b0: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65      */.    nName
e2c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e2d0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  30(zName);.    f
e2e0: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
e2f0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
e300: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e310: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
e320: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
e330: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61      char *zNewNa
e340: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  me;.        int 
e350: 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b  k;.        for(k
e360: 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26  =nName-1; k>1 &&
e370: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
e380: 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b  zName[k]); k--){
e390: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e  }.        if( k>
e3a0: 3d 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d  =0 && zName[k]==
e3b0: 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b  ':' ) nName = k;
e3c0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e  .        zName[n
e3d0: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
e3e0: 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71     zNewName = sq
e3f0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
e400: 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%s:%d", zName,
e410: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
e420: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e430: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
e440: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e     zName = zNewN
e450: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  ame;.        j =
e460: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
e470: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
e480: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
e490: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
e4a0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20   = zName;.  }.  
e4b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
e4c0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
e4d0: 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
e4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e4f0: 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
e500: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
e510: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e520: 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
e530: 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
e540: 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
e550: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e560: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
e570: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e580: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
e590: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
e5a0: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
e5b0: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
e5c0: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
e5d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
e5e0: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
e5f0: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
e600: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
e610: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
e620: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
e630: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
e640: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
e650: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
e660: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
e670: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
e680: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
e690: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
e6a0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
e6b0: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
e6c0: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
e6d0: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
e6e0: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
e6f0: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73  e resolved..*/.s
e700: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
e710: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
e720: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
e730: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e740: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e750: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62  ontexts */.  Tab
e760: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
e770: 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e     /* Add column
e780: 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f   type informatio
e790: 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  n to this table 
e7a0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
e7b0: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
e7c0: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
e7d0: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
e7e0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
e7f0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
e800: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
e810: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
e820: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
e830: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
e840: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
e850: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
e860: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
e870: 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20  ;.  u64 szAll = 
e880: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
e890: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
e8a0: 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
e8b0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
e8c0: 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
e8d0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
e8e0: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
e8f0: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
e900: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e910: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
e920: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
e930: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
e940: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
e950: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
e960: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
e970: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
e980: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
e990: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
e9a0: 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  b->aCol; i<pTab-
e9b0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
e9c0: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69  ++){.    p = a[i
e9d0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
e9e0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20   pCol->zType==0 
e9f0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
ea00: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
ea10: 53 74 72 44 75 70 28 64 62 2c 20 0a 20 20 20 20  StrDup(db, .    
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 20 20 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26      columnType(&
ea40: 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70  sNC, p,0,0,0, &p
ea50: 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20  Col->szEst));.  
ea60: 20 20 7d 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d    }.    szAll +=
ea70: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20   pCol->szEst;.  
ea80: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
ea90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
eaa0: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69  finity(p);.    i
eab0: 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  f( pCol->affinit
eac0: 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66  y==0 ) pCol->aff
ead0: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
eae0: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f  FF_BLOB;.    pCo
eaf0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
eb00: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
eb10: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
eb20: 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  l && pCol->zColl
eb30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  ==0 ){.      pCo
eb40: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
eb50: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
eb60: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
eb70: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
eb80: 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74  szTabRow = sqlit
eb90: 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34  e3LogEst(szAll*4
eba0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
ebb0: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
ebc0: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
ebd0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
ebe0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
ebf0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
ec00: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
ec10: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
ec20: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
ec30: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
ec40: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
ec50: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
ec60: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
ec70: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ec80: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
ec90: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
eca0: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
ecb0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
ecc0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
ecd0: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
ece0: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
ecf0: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
ed00: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
ed10: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
ed20: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
ed30: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
ed40: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
ed50: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
ed60: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
ed70: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
ed80: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
ed90: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
eda0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
edb0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
edc0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
edd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ede0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
edf0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
ee00: 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
ee10: 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
ee20: 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
ee30: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
ee40: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
ee50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
ee60: 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54  abled==0 );.  pT
ee70: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
ee80: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
ee90: 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  .  pTab->nRowLog
eea0: 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
eeb0: 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
eec0: 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
eed0: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
eee0: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
eef0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
ef00: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
ef10: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
ef20: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
ef30: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
ef40: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
ef50: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  b, pSelect);.  p
ef60: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
ef70: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
ef80: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
ef90: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
efa0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
efb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
efc0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
efd0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
efe0: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
eff0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
f000: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
f010: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
f020: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
f030: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
f040: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
f050: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
f060: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
f070: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
f080: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
f090: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f0a0: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
f0b0: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
f0c0: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
f0d0: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
f0e0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 20  rse);.    if( v 
f0f0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
f100: 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b  Op0(v, OP_Init);
f110: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
f120: 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
f130: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
f140: 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65  onEnabled(pParse
f150: 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74  ->db,SQLITE_Fact
f160: 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20 20  orOutConst).    
f170: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
f180: 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
f190: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20   1;.    }..  }. 
f1a0: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
f1b0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
f1c0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
f1d0: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
f1e0: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
f1f0: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
f200: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
f210: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
f220: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
f230: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
f240: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
f250: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
f260: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
f270: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
f280: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
f290: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
f2a0: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
f2b0: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
f2c0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f2d0: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
f2e0: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
f2f0: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
f300: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
f310: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
f320: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
f330: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
f340: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
f350: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
f360: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
f370: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
f380: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
f390: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
f3a0: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
f3b0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
f3c0: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
f3d0: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
f3e0: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
f3f0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
f400: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
f410: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
f420: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
f430: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
f440: 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
f450: 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
f460: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
f470: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
f480: 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
f490: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
f4a0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
f4b0: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
f4c0: 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
f4d0: 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
f4e0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
f4f0: 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
f500: 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
f510: 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
f520: 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
f530: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
f540: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
f550: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
f560: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
f570: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
f580: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
f590: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
f5a0: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
f5b0: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
f5c0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
f5d0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
f5e0: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
f5f0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
f600: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
f610: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
f620: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
f630: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
f640: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
f650: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
f660: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
f670: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
f680: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
f690: 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28   addr1, n;.  if(
f6a0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
f6b0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
f6c0: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
f6d0: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
f6e0: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
f6f0: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72  e.  ** controver
f700: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
f710: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
f720: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
f730: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
f740: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
f750: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
f760: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
f770: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
f780: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
f790: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
f7a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
f7b0: 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69  set==0 || p->pLi
f7c0: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  mit!=0 );.  if( 
f7d0: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
f7e0: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
f7f0: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
f800: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
f810: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f820: 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rse);.    assert
f830: 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( v!=0 );.    if
f840: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
f850: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74  nteger(p->pLimit
f860: 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  , &n) ){.      s
f870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f880: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
f890: 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  n, iLimit);.    
f8a0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f8b0: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
f8c0: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  "));.      if( n
f8d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
f8e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f8f0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
f900: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
f910: 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26  else if( n>=0 &&
f920: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28   p->nSelectRow>(
f930: 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20  u64)n ){.       
f940: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
f950: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
f960: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f970: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f980: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
f990: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
f9a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f9b0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f9c0: 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
f9d0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f9e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f9f0: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
fa00: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
fa10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fa20: 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74  OP_IfNot, iLimit
fa30: 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
fa40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fa50: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66  }.    if( p->pOf
fa60: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  fset ){.      p-
fa70: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
fa80: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
fa90: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
faa0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
fab0: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
fac0: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
fad0: 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
fae0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
faf0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
fb00: 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
fb10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fb20: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fb30: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66  _MustBeInt, iOff
fb40: 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
fb50: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
fb60: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
fb70: 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
fb80: 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
fb90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fba0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
fbb0: 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
fbc0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
fbd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fbe0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
fbf0: 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  0, iOffset);.   
fc00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
fc10: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
fc20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fc30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fc40: 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  Add, iLimit, iOf
fc50: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29  fset, iOffset+1)
fc60: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
fc70: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
fc80: 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20  FFSET"));.      
fc90: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
fca0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fcb0: 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 20  IfPos, iLimit); 
fcc0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
fcd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fce0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fcf0: 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66  nteger, -1, iOff
fd00: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  set+1);.      sq
fd10: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fd20: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
fd30: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
fd40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
fd50: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
fd60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
fd70: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
fd80: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
fd90: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
fda0: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
fdb0: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
fdc0: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
fdd0: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
fde0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
fdf0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
fe00: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
fe10: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fe20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
fe30: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
fe40: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
fe50: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
fe60: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
fe70: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
fe80: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
fe90: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
fea0: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
feb0: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
fec0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
fed0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
fee0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
fef0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
ff00: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
ff10: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
ff20: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
ff30: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
ff40: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
ff50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
ff60: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
ff70: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
ff80: 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65   /* iCol must be
ff90: 20 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45   less than p->pE
ffa0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74  List->nExpr.  Ot
ffb0: 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
ffc0: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65   would.  ** have
ffd0: 20 62 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72   been thrown dur
ffe0: 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ing name resolut
fff0: 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ion and we would
10000 20 6e 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e   not have gotten
10010 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a  .  ** this far *
10020 2f 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  /.  if( pRet==0 
10030 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
10040 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
10050 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
10060 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
10070 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
10080 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
10090 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
100a0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
100b0 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
100c0 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
100d0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
100e0 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75  eter is a compou
100f0 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  nd SELECT.** wit
10100 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
10110 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ause. This funct
10120 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
10130 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49  d returns a KeyI
10140 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
10150 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d   suitable for im
10160 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
10170 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53  RDER BY..**.** S
10180 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
10190 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
101a0 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
101b0 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20  rom malloc. The 
101c0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
101d0 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
101e0 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
101f0 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
10200 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
10210 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73  y.** freed..*/.s
10220 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d  tatic KeyInfo *m
10230 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
10240 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a  yKeyInfo(Parse *
10250 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
10260 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a  p, int nExtra){.
10270 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10280 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
10290 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  By;.  int nOrder
102a0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
102b0 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74  ->nExpr;.  sqlit
102c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
102d0 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  >db;.  KeyInfo *
102e0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65  pRet = sqlite3Ke
102f0 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
10300 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20  OrderBy+nExtra, 
10310 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  1);.  if( pRet )
10320 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
10330 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
10340 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
10350 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10360 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
10370 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b  &pOrderBy->a[i];
10380 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
10390 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  rm = pItem->pExp
103a0 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  r;.      CollSeq
103b0 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20   *pColl;..      
103c0 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
103d0 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
103e0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
103f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
10400 53 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72  Seq(pParse, pTer
10410 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
10420 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
10430 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
10440 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70  Seq(pParse, p, p
10450 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
10460 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ByCol-1);.      
10470 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
10480 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
10490 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
104a0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
104b0 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Expr =.         
104c0 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
104d0 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61  ollateString(pPa
104e0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c  rse, pTerm, pCol
104f0 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
10500 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
10510 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
10520 73 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29  sWriteable(pRet)
10530 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   );.      pRet->
10540 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
10550 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53  ;.      pRet->aS
10560 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
10570 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
10580 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
10590 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
105a0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
105b0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
105c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
105d0 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63  generates VDBE c
105e0 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ode to compute t
105f0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
10600 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a  WITH RECURSIVE.*
10610 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  * query of the f
10620 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65  orm:.**.**   <re
10630 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41  cursive-table> A
10640 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e  S (<setup-query>
10650 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65   UNION [ALL] <re
10660 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a  cursive-query>).
10670 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10680 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
10690 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
106a0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
106b0 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20      p->pPrior   
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68     p.**.**.** Th
10700 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
10710 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
10720 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
10730 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
10740 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63  clause.** of rec
10750 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61  ursive-query, ma
10760 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72  rked with the Sr
10770 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73  cList->a[].fg.is
10780 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a  Recursive flag..
10790 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d  **.** The setup-
107a0 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20  query runs once 
107b0 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69  to generate an i
107c0 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f  nitial set of ro
107d0 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e  ws that go.** in
107e0 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c 65  to a Queue table
107f0 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74 72  .  Rows are extr
10800 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51  acted from the Q
10810 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62  ueue table one b
10820 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20  y.** one.  Each 
10830 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66 72  row extracted fr
10840 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74 70  om Queue is outp
10850 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  ut to pDest.  Th
10860 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a  en the single.**
10870 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20 28   extracted row (
10880 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72 72  now in the iCurr
10890 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d  ent table) becom
108a0 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  es the content o
108b0 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69  f the.** recursi
108c0 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72  ve-table for a r
108d0 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20 72  ecursive-query r
108e0 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20  un.  The output 
108f0 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
10900 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64  -query.** is add
10910 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
10920 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
10930 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20  hen another row 
10940 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
10950 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74  m Queue.** and t
10960 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e  he iteration con
10970 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65  tinues until the
10980 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
10990 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
109a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
109b0 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ry operator is U
109c0 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70  NION then no dup
109d0 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65 20  licate rows are 
109e0 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ever.** inserted
109f0 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
10a00 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73  table.  The iDis
10a10 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70  tinct table keep
10a20 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20  s a copy of all 
10a30 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  rows.** that hav
10a40 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65  e ever been inse
10a50 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20  rted into Queue 
10a60 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c 69  and causes dupli
10a70 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64  cates to be.** d
10a80 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74 68  iscarded.  If th
10a90 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  e operator is UN
10aa0 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75  ION ALL, then du
10ab0 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c  plicates are all
10ac0 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  owed..** .** If 
10ad0 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61 6e  the query has an
10ae0 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20   ORDER BY, then 
10af0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 51  entries in the Q
10b00 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b  ueue table are k
10b10 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20  ept in.** ORDER 
10b20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65  BY order and the
10b30 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73 20   first entry is 
10b40 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65 61  extracted for ea
10b50 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f  ch cycle.  Witho
10b60 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42  ut.** an ORDER B
10b70 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  Y, the Queue tab
10b80 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49 46  le is just a FIF
10b90 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49  O..**.** If a LI
10ba0 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70 72  MIT clause is pr
10bb0 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65  ovided, then the
10bc0 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73   iteration stops
10bd0 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77   after LIMIT row
10be0 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f  s.** have been o
10bf0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
10c00 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f   A LIMIT of zero
10c10 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
10c20 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a   no rows and a.*
10c30 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54  * negative LIMIT
10c40 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
10c50 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74   all rows.  If t
10c60 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20  here is also an 
10c70 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a  OFFSET clause.**
10c80 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 65   with a positive
10c90 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
10ca0 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75   first OFFSET ou
10cb0 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61 72  tputs are discar
10cc0 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68  ded rather.** th
10cd0 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  an being sent to
10ce0 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d   pDest.  The LIM
10cf0 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f  IT count does no
10d00 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66  t begin until af
10d10 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f  ter OFFSET.** ro
10d20 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ws have been ski
10d30 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
10d40 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69 74  void generateWit
10d50 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
10d60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10d70 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
10d80 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10d90 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10da0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
10db0 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
10dc0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
10dd0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
10de0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
10df0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
10e00 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
10e10 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
10e20 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20  ->pSrc;      /* 
10e30 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10e40 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
10e50 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10e60 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
10e70 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d  ->nExpr;  /* Num
10e80 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10e90 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
10ea0 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20  table */.  Vdbe 
10eb0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
10ec0 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
10ed0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
10ee0 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
10ef0 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ction */.  Selec
10f00 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70  t *pSetup = p->p
10f10 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  Prior;   /* The 
10f20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20  setup query */. 
10f30 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10f50 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10f60 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
10f70 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20  ont, addrBreak; 
10f80 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45       /* CONTINUE
10f90 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65   and BREAK addre
10fa0 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sses */.  int iC
10fb0 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  urrent = 0;     
10fc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
10fd0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
10fe0 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74    int regCurrent
10ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11000 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
11010 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c  ing Current tabl
11020 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75  e */.  int iQueu
11030 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11040 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75       /* The Queu
11050 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
11060 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20   iDistinct = 0; 
11070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
11080 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72   ensure unique r
11090 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20  esults if UNION 
110a0 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
110b0 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20   SRT_Fifo;      
110c0 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69     /* How to wri
110d0 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20  te to Queue */. 
110e0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
110f0 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f  Queue;         /
11100 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61 72  * SelectDest tar
11110 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65 75  getting the Queu
11120 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
11130 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
11140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11150 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11160 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11180 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11190 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
111a0 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
111b0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
111c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
111d0 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
111e0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  et;       /* Sav
111f0 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  ed LIMIT and OFF
11200 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  SET */.  int reg
11210 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74  Limit, regOffset
11220 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ;      /* Regist
11230 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49  ers used by LIMI
11240 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
11250 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
11260 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
11270 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
11280 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
11290 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
112a0 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
112b0 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
112c0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
112d0 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49  Process the LIMI
112e0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
112f0 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78  uses, if they ex
11300 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65  ist */.  addrBre
11310 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
11320 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
11330 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
11340 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
11350 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
11360 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
11370 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70  t;.  pOffset = p
11380 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67  ->pOffset;.  reg
11390 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
113a0 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d  t;.  regOffset =
113b0 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
113c0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f  ->pLimit = p->pO
113d0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ffset = 0;.  p->
113e0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
113f0 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
11400 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
11410 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
11420 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
11430 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
11440 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
11450 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
11460 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
11470 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
11480 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  [i].fg.isRecursi
11490 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
114a0 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
114b0 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
114c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
114d0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
114e0 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
114f0 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
11500 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
11510 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
11520 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
11530 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
11540 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
11550 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
11560 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
11570 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
11580 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
11590 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
115a0 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
115b0 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
115c0 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
115d0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
115e0 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
115f0 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
11600 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
11610 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
11620 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
11630 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
11640 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
11650 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
11660 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
11670 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
11680 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
11690 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
116a0 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
116b0 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
116c0 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
116d0 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
116e0 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
116f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
11700 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11710 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
11720 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
11730 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
11740 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
11750 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
11760 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
11770 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
11780 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
11790 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
117a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
117b0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
117c0 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
117d0 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117f0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
11800 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
11810 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
11820 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
11830 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
11840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11850 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
11860 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
11870 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
11880 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
11890 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
118a0 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
118b0 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
118c0 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
118d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
118e0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
118f0 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
11900 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
11910 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
11920 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
11930 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
11940 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
11950 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
11960 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
11970 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
11980 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
11990 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
119a0 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
119b0 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
119c0 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  t = 0;.  rc = sq
119d0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
119e0 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
119f0 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
11a00 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
11a10 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
11a20 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
11a30 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
11a40 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
11a50 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
11a60 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
11a70 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
11a80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11a90 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
11aa0 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
11ab0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
11ac0 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
11ad0 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
11ae0 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
11af0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
11b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11b10 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
11b20 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
11b30 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
11b40 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
11b50 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
11b60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11b70 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
11b80 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
11b90 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
11ba0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11bb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11bc0 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
11bd0 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
11be0 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
11bf0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11c00 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
11c10 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
11c20 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
11c30 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
11c40 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
11c50 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11c60 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
11c70 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
11c80 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
11c90 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
11ca0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
11cb0 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20  t, iCurrent,.   
11cc0 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20     0, 0, pDest, 
11cd0 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
11ce0 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c  eak);.  if( regL
11cf0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
11d00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11d10 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
11d20 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72  , regLimit, addr
11d30 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
11d40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
11d50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
11d60 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
11d70 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45  drCont);..  /* E
11d80 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72  xecute the recur
11d90 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69  sive SELECT taki
11da0 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ng the single ro
11db0 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a  w in Current as.
11dc0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66    ** the value f
11dd0 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
11de0 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68  -table. Store th
11df0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
11e00 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69   Queue..  */.  i
11e10 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
11e20 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
11e30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11e40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 65  rMsg(pParse, "re
11e50 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61 74  cursive aggregat
11e60 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75  e queries not su
11e70 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c  pported");.  }el
11e80 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  se{.    p->pPrio
11e90 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  r = 0;.    sqlit
11ea0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11eb0 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
11ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
11ed0 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
11ee0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
11ef0 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b  tup;.  }..  /* K
11f00 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  eep running the 
11f10 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51  loop until the Q
11f20 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f  ueue is empty */
11f30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11f40 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
11f50 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
11f60 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11f70 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
11f80 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72  reak);..end_of_r
11f90 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a  ecursive_query:.
11fa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
11fb0 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
11fc0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
11fd0 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  ;.  p->pOrderBy 
11fe0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d  = pOrderBy;.  p-
11ff0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
12000 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  ;.  p->pOffset =
12010 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75   pOffset;.  retu
12020 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
12030 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
12040 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
12050 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61  eferences */.sta
12060 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
12070 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
12080 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
12090 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
120a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
120b0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
120c0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
120d0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
120e0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
120f0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
12100 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
12110 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
12120 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a  esults */.);../*
12130 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73  .** Handle the s
12140 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
12150 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
12160 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
12170 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45   from a.** VALUE
12180 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61  S clause.  By ha
12190 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61  ndling this as a
121a0 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77   special case, w
121b0 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20  e avoid deep.** 
121c0 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74  recursion, and t
121d0 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  hus do not need 
121e0 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53  to enforce the S
121f0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
12200 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f  OUND_SELECT.** o
12210 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  n a VALUES claus
12220 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  e..**.** Because
12230 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
12240 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  ct originates fr
12250 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  om a VALUES clau
12260 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 49 74 20  se:.**   (1) It 
12270 68 61 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20  has no LIMIT or 
12280 4f 46 46 53 45 54 0a 2a 2a 20 20 20 28 32 29 20  OFFSET.**   (2) 
12290 41 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 55 4e  All terms are UN
122a0 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29  ION ALL.**   (3)
122b0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   There is no ORD
122c0 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2f 0a  ER BY clause.*/.
122d0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
122e0 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20  SelectValues(.  
122f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12300 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
12310 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
12320 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
12330 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
12340 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
12350 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
12360 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
12370 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
12380 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
12390 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
123a0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
123b0 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b  .  int nRow = 1;
123c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
123d0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
123e0 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
123f0 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  alue );.  do{.  
12400 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
12410 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
12420 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
12430 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
12440 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | (p->op==TK_SEL
12450 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ECT && p->pPrior
12460 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
12470 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
12480 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12490 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
124a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
124b0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pNext==0 || p->p
124c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d  EList->nExpr==p-
124d0 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e  >pNext->pEList->
124e0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28  nExpr );.    if(
124f0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
12500 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
12510 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  t( p->pPrior->pN
12520 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20  ext==p );.    p 
12530 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
12540 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c   nRow++;.  }whil
12550 65 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  e(1);.  while( p
12560 20 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   ){.    pPrior =
12570 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
12580 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
12590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
125a0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
125b0 20 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e   pDest);.    p->
125c0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
125d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
125e0 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  eak;.    p->nSel
125f0 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  ectRow = nRow;. 
12600 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
12610 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12630 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12640 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63  d to process a c
12650 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f  ompound query fo
12660 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f  rm from.** two o
12670 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
12680 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e  queries using UN
12690 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  ION, UNION ALL, 
126a0 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e  EXCEPT, or.** IN
126b0 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70  TERSECT.**.** "p
126c0 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
126d0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
126e0 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
126f0 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
12700 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
12710 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
12720 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
12730 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
12740 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
12750 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
12760 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
12770 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
12780 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
12790 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
127a0 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
127b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
127c0 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
127d0 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
127e0 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
127f0 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
12800 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
12810 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
12820 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
12830 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
12840 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
12850 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
12860 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
12870 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
12880 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
12890 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
128a0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
128b0 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
128c0 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
128d0 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
128e0 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
128f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12900 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
12910 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
12920 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
12930 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
12940 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
12950 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
12960 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
12970 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
12980 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
12990 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
129a0 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
129b0 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
129c0 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
129d0 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
129e0 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
129f0 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
12a00 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
12a10 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
12a20 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
12a30 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
12a40 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
12a50 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
12a60 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
12a70 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
12a80 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
12a90 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20  t multiSelect(. 
12aa0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12ab0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12ac0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
12ad0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12ae0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
12af0 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
12b00 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
12b10 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
12b20 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
12b30 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
12b40 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
12b50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12b60 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
12b70 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
12b80 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
12b90 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
12ba0 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
12bb0 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
12bc0 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
12bd0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
12be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
12bf0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
12c00 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
12c10 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
12c20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
12c30 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69  e data destinati
12c40 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
12c50 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a  pDelete = 0;  /*
12c60 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65   Chain of simple
12c70 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65   selects to dele
12c80 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
12c90 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
12ca0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
12cb0 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20  tion */.#ifndef 
12cc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
12cd0 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20  AIN.  int iSub1 
12ce0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
12cf0 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
12d00 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
12d10 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20  t iSub2 = 0;    
12d20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
12d30 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
12d40 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  y */.#endif..  /
12d50 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
12d60 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
12d70 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
12d80 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
12d90 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
12da0 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
12db0 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
12dc0 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
12dd0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
12de0 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
12df0 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
12e00 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
12e10 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
12e20 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
12e30 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ch */.  assert( 
12e40 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
12e50 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20  F_Recursive)==0 
12e60 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  || p->op==TK_ALL
12e70 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   || p->op==TK_UN
12e80 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  ION );.  db = pP
12e90 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69  arse->db;.  pPri
12ea0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
12eb0 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b    dest = *pDest;
12ec0 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
12ed0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
12ee0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12ef0 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20  Parse,"ORDER BY 
12f00 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
12f10 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
12f20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
12f30 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
12f40 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
12f50 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
12f60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
12f70 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
12f80 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
12f90 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12fa0 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
12fb0 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
12fc0 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
12fd0 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
12fe0 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
12ff0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
13000 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
13010 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
13020 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13030 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
13040 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
13050 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
13060 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
13070 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
13080 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
13090 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
130a0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
130b0 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
130c0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
130d0 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
130e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
130f0 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
13100 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13110 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
13120 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  al, dest.iSDParm
13130 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
13140 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
13150 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
13160 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
13170 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74  ;.    dest.eDest
13180 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
13190 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
131a0 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63  handling for a c
131b0 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74  ompound-select t
131c0 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61  hat originates a
131d0 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  s a VALUES claus
131e0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
131f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
13200 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  ultiValue ){.   
13210 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
13220 74 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20  tValues(pParse, 
13230 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67  p, &dest);.    g
13240 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
13250 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
13260 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45  Make sure all SE
13270 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61  LECTs in the sta
13280 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20  tement have the 
13290 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  same number of e
132a0 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20  lements.  ** in 
132b0 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74  their result set
132c0 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
132d0 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
132e0 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
132f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
13300 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72  List->nExpr==pPr
13310 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
13320 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  pr );..#ifndef S
13330 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
13340 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
13350 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
13360 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57  ){.    generateW
13370 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72  ithRecursiveQuer
13380 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  y(pParse, p, &de
13390 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  st);.  }else.#en
133a0 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75  dif..  /* Compou
133b0 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20  nd SELECTs that 
133c0 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
133d0 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64   clause are hand
133e0 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  led separately..
133f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f    */.  if( p->pO
13400 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
13410 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
13420 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
13430 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c  p, pDest);.  }el
13440 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  se..  /* Generat
13450 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
13460 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
13470 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
13480 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
13490 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
134a0 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
134b0 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
134c0 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
134d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
134e0 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20  !pPrior->pLimit 
134f0 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
13500 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
13510 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
13520 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->iOffset = p->
13530 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  iOffset;.      p
13540 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
13550 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
13560 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
13570 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
13580 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
13590 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
135a0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
135b0 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
135c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
135d0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
135e0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
135f0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
13600 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
13610 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
13620 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
13630 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13650 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
13660 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
13670 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
13680 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
13690 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
136a0 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
136b0 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
136c0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
136d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
136e0 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d  P_IfNot, p->iLim
136f0 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
13700 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
13710 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
13720 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
13730 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
13740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
13750 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
13760 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
13770 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
13780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13790 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
137a0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
137b0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
137c0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
137d0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
137e0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
137f0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
13800 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
13810 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
13820 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
13830 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
13840 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
13850 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
13860 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
13870 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
13880 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
13890 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
138a0 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20  > (u64)nLimit . 
138b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
138c0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
138d0 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a  nLimit;.      }.
138e0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
138f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13900 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13910 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
13920 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13930 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
13940 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
13950 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
13960 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
13970 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
13980 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
13990 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
139a0 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
139b0 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
139c0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
139d0 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
139e0 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
139f0 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
13a00 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
13a10 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
13a20 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
13a30 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
13a40 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
13a50 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
13a60 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
13a70 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
13a80 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
13a90 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
13aa0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
13ab0 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
13ac0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
13ad0 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20  =TK_EXCEPT );.  
13ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
13af0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
13b00 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
13b10 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
13b20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
13b30 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  ==priorOp ){.   
13b40 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
13b50 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
13b60 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
13b70 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
13b80 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
13b90 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
13ba0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13bb0 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
13bc0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c        /* Not all
13bd0 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
13be0 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
13bf0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13c00 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
13c10 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
13c20 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
13c30 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
13c40 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74   unionTab = dest
13c50 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
13c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
13c70 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
13c80 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
13c90 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13ca0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
13cb0 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
13cc0 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
13cd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13ce0 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
13cf0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
13d00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13d10 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
13d20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
13d30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13d40 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
13d50 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
13d60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13d70 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
13d80 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
13d90 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
13da0 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
13db0 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67  .        findRig
13dc0 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
13dd0 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
13de0 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
13df0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
13e00 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
13e10 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
13e20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13e30 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
13e40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
13e50 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
13e60 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
13e70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
13e80 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73  stInit(&uniondes
13e90 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  t, priorOp, unio
13ea0 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70  nTab);.      exp
13eb0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
13ec0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
13ed0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
13ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13ef0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
13f00 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
13f10 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
13f20 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
13f30 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
13f40 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
13f50 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
13f60 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
13f70 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
13f80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
13f90 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
13fa0 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
13fb0 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
13fc0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
13fd0 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
13fe0 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
13ff0 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
14000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
14010 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
14020 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
14030 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
14040 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
14050 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
14060 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
14070 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
14080 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
14090 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65  st = op;.      e
140a0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
140b0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
140c0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
140d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
140e0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
140f0 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
14100 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14120 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79  ;.      /* Query
14130 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
14140 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
14150 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
14160 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a  OrderBy..      *
14170 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
14180 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
14190 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
141a0 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
141b0 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ak. */.      sql
141c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
141d0 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
141e0 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  By);.      pDele
141f0 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
14200 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
14210 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
14220 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
14230 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
14240 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e  ==TK_UNION ) p->
14250 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
14260 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
14270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14280 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
14290 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
142a0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
142b0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
142c0 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
142d0 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
142e0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
142f0 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
14300 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
14310 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
14320 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
14330 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
14340 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
14350 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
14360 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
14370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
14380 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
14390 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
143a0 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
143b0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
143c0 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
143d0 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
143e0 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
143f0 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
14400 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
14410 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74          if( dest
14420 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
14430 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
14440 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
14450 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   p;.          wh
14460 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
14470 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
14480 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
14490 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
144a0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
144b0 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
144c0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
144d0 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
144e0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
144f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
14500 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
14510 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14520 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
14530 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
14540 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
14550 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
14560 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14570 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
14580 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
14590 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
145a0 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  v);.        iSta
145b0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
145c0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
145d0 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
145e0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
145f0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
14600 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ionTab,.        
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14620 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
14630 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
14640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14650 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14660 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
14670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14680 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
14690 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
146a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
146b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
146c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
146d0 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
146e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
146f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
14700 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
14710 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14720 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14730 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
14740 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  t( p->op==TK_INT
14750 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20  ERSECT ); {.    
14760 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
14770 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
14780 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
14790 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
147a0 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
147b0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
147c0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
147d0 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
147e0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
147f0 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
14800 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
14810 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
14820 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
14830 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
14840 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
14850 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
14860 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
14870 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
14880 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
14890 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
148a0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
148b0 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
148c0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
148d0 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
148e0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
148f0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
14900 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64  ==0 );..      ad
14910 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14920 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
14930 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31  nEphemeral, tab1
14940 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
14950 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
14960 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
14970 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
14980 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
14990 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74  .      findRight
149a0 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
149b0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
149c0 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73  meral;.      ass
149d0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
149e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
149f0 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
14a00 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
14a10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
14a20 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
14a30 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
14a40 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65  ctDestInit(&inte
14a50 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55  rsectdest, SRT_U
14a60 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20  nion, tab1);.   
14a70 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14a80 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
14a90 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14aa0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
14ab0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
14ac0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
14ad0 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
14ae0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
14af0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
14b00 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
14b10 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
14b20 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
14b30 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
14b40 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
14b50 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  2".      */.    
14b60 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
14b70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14b80 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
14b90 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
14ba0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
14bb0 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
14bc0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
14bd0 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61  rOpenEphm[1] = a
14be0 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ddr;.      p->pP
14bf0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
14c00 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
14c10 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
14c20 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
14c30 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
14c40 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
14c50 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
14c60 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
14c70 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  SDParm = tab2;. 
14c80 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
14c90 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
14ca0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
14cb0 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
14cc0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
14cd0 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
14ce0 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
14cf0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
14d00 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
14d10 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
14d20 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
14d30 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
14d40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
14d50 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
14d60 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
14d70 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
14d80 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
14d90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14da0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
14db0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
14dc0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
14dd0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
14de0 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
14df0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
14e00 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
14e10 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
14e20 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
14e30 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
14e40 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
14e50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14e60 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
14e70 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
14e80 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
14e90 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
14ea0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
14eb0 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
14ec0 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
14ed0 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
14ee0 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65  or;.        gene
14ef0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
14f00 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
14f10 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
14f20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
14f30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
14f40 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
14f50 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = 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 63 6f 6d 70 75 74 65  );.      compute
14f80 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
14f90 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
14fa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14fb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14fc0 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
14fd0 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
14fe0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72  rage(v);.      r
14ff0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15000 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15010 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
15020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15030 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
15040 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
15050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15060 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
15070 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
15080 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76   r1, 0); VdbeCov
15090 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
150a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
150b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
150c0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
150d0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
150e0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
150f0 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ab1,.           
15100 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
15110 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
15120 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
15130 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15140 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
15150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15160 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
15170 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
15180 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
15190 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
151a0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
151b0 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
151c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
151d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
151e0 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
151f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15200 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
15210 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
15220 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15230 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f    }..  explainCo
15240 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
15250 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
15260 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41  ub2, p->op!=TK_A
15270 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  LL);..  /* Compu
15280 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
15290 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
152a0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
152b0 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
152c0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
152d0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
152e0 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
152f0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
15300 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
15310 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
15320 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
15330 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
15340 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
15350 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
15360 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
15370 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
15380 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
15390 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
153a0 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
153b0 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
153c0 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
153d0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
153e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
153f0 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
15400 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
15410 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
15420 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
15430 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
15440 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
15470 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
15480 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
15490 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
154a0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
154b0 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
154c0 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
154d0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
154e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
154f0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
15500 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
15510 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
15520 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
15530 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
15540 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
15550 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
15560 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
15590 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
155a0 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
155b0 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
155c0 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
155d0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
155e0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
155f0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
15600 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29  loc(db, nCol, 1)
15610 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
15620 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
15630 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
15640 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
15650 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
15660 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
15670 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
15680 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
15690 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
156a0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
156b0 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
156c0 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
156d0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
156e0 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
156f0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
15700 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
15710 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
15720 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
15730 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
15740 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
15750 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
15760 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
15770 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
15780 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
15790 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
157a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
157b0 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
157c0 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
157d0 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
157e0 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
157f0 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
15800 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
15810 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
15820 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
15830 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
15840 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
15850 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
15860 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
15870 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
15890 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
158a0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
158b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
158c0 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
158d0 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
158e0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
158f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
15910 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
15920 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
15930 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
15940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15950 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
15960 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
15970 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
15980 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
15990 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
159a0 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
159b0 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
159c0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
159d0 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
159e0 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
159f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
15a00 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
15a10 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
15a20 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  .** Error messag
15a30 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f  e for when two o
15a40 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  r more terms of 
15a50 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
15a60 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  t have different
15a70 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20  .** size result 
15a80 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sets..*/.void sq
15a90 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
15aa0 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61  NumTermsError(Pa
15ab0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
15ac0 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
15ad0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
15ae0 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71  Values ){.    sq
15af0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15b00 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
15b10 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
15b20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
15b30 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  erms");.  }else{
15b40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15b50 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
15b60 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
15b70 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
15b80 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
15b90 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
15ba0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
15bb0 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
15bc0 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
15bd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
15be0 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
15bf0 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
15c00 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
15c10 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
15c20 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
15c30 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
15c40 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
15c50 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
15c60 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
15c70 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
15c80 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
15c90 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
15ca0 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
15cb0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
15cc0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
15cd0 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
15ce0 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
15cf0 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
15d00 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
15d10 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
15d20 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
15d30 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
15d40 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
15d50 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
15d60 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
15d70 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
15d80 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
15d90 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
15da0 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
15db0 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
15dc0 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
15dd0 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
15de0 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
15df0 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
15e00 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
15e10 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
15e20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
15e30 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
15e40 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
15e50 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
15e60 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
15e70 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
15e80 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
15e90 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
15ea0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
15eb0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
15ed0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15ee0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
15ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15f00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15f10 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
15f20 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
15f30 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
15f40 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
15f50 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
15f60 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
15f70 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
15f80 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
15f90 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
15fa0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
15fb0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
15fc0 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
15fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
15fe0 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
15ff0 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
16000 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
16010 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16020 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
16030 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
16040 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
16050 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
16060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
16070 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
16080 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
16090 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
160a0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
160b0 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
160c0 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
160d0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
160e0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
160f0 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
16100 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
16110 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
16120 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
16130 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
16140 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
16150 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
16160 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
16170 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d  j1, j2;.    j1 =
16180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16190 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
161a0 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f  regPrev); VdbeCo
161b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 6a  verage(v);.    j
161c0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
161d0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
161e0 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
161f0 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
16200 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
16230 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
16240 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
16250 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
16260 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16270 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69  OP_Jump, j2+2, i
16280 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b  Continue, j2+2);
16290 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
162a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
162b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
162c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
162d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
162e0 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
162f0 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
16300 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
16310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16320 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
16330 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
16340 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
16350 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
16360 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
16370 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
16380 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
16390 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
163a0 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
163b0 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
163c0 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
163d0 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
163e0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
163f0 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
16400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
16410 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
16420 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63  Table );.  switc
16430 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
16440 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
16450 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
16460 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
16470 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
16480 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
16490 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
164a0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
164b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
164c0 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
164d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
164e0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
164f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16500 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
16510 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
16520 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
16530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16540 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16550 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
16560 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
16570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16580 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
16590 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
165a0 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
165b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
165c0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
165d0 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
165e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
165f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16600 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
16610 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16620 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
16630 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16640 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16650 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
16660 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
16670 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
16680 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
16690 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
166a0 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
166b0 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
166c0 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
166d0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
166e0 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
166f0 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
16700 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
16710 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
16720 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
16730 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
16740 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
16750 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
16760 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
16770 30 20 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74  0 );.      pDest
16780 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20  ->affSdst = .   
16790 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
167a0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e  pareAffinity(p->
167b0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
167c0 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64  pr, pDest->affSd
167d0 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  st);.      r1 = 
167e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
167f0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16810 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
16820 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
16830 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e   1, r1, &pDest->
16840 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20  affSdst,1);.    
16850 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16860 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
16870 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
16880 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
16890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
168a0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
168b0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
168c0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
168d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
168e0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
168f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16900 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
16910 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
16920 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
16930 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
16940 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
16950 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
16960 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
16970 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
16980 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
16990 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
169a0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
169b0 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
169c0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
169d0 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
169e0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
169f0 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  0 );  testcase( 
16a00 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b  pIn->nSdst!=1 );
16a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16a20 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
16a30 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
16a40 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
16a50 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
16a60 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
16a70 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
16a80 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
16a90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16aa0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
16ab0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16ac0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
16ad0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
16ae0 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
16af0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
16b00 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
16b10 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
16b20 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
16b30 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
16b40 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
16b50 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
16b60 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
16b70 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
16b80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
16b90 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
16ba0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
16bb0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
16bc0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
16bd0 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
16be0 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
16bf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16c00 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
16c10 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
16c20 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  st->iSdst, pIn->
16c30 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
16c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16c50 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
16c60 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
16c70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16c80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
16c90 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
16ca0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
16cb0 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
16cc0 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
16cd0 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
16ce0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
16cf0 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
16d00 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
16d10 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
16d20 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
16d30 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
16d40 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
16d50 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
16d60 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
16d70 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
16d80 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
16d90 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
16da0 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
16db0 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
16dc0 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
16dd0 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
16de0 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
16df0 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
16e00 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
16e10 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
16e20 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
16e30 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
16e40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16e50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16e60 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
16e70 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16e80 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
16e90 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
16ea0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
16eb0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
16ec0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
16ed0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16ee0 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
16ef0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
16f00 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
16f10 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
16f20 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
16f30 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
16f40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16f50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
16f60 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
16f70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16f80 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
16f90 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
16fa0 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
16fb0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
16fc0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
16fd0 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
16fe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16ff0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
17000 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
17010 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
17020 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
17030 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
17040 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
17050 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
17060 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
17070 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
17080 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
17090 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
170a0 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
170b0 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
170c0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
170d0 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
170e0 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
170f0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
17100 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
17110 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
17120 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
17130 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
17140 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
17150 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
17160 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
17170 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17180 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
17190 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
171a0 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
171b0 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
171c0 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
171d0 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
171e0 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
171f0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
17200 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
17210 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
17220 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
17230 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
17240 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
17250 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
17260 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
17270 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
17280 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
17290 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
172a0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
172b0 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
172c0 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
172d0 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
172e0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
172f0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
17300 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
17310 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
17320 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
17330 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
17340 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
17350 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
17360 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
17370 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
17380 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
17390 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
173a0 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
173b0 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
173c0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
173d0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
173e0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
173f0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
17400 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
17410 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
17420 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
17430 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
17440 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
17450 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
17460 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
17470 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
17480 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
17490 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
174a0 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
174b0 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
174c0 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
174d0 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
174e0 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
174f0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
17500 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
17510 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17520 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
17530 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
17540 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
17550 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
17560 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
17570 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
17580 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
17590 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
175a0 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
175b0 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
175c0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
175d0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
175e0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
175f0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
17600 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
17610 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
17620 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
17630 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
17640 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
17650 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
17660 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17670 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
17680 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
17690 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
176a0 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
176b0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
176c0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
176d0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
176e0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
176f0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
17700 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
17710 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
17720 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
17730 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
17740 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
17750 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
17760 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
17770 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17780 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
17790 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
177a0 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
177b0 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
177c0 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
177d0 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
177e0 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
177f0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
17800 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
17810 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
17820 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
17830 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
17840 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
17850 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
17860 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
17870 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
17880 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
17890 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
178a0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
178b0 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
178c0 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
178d0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
178e0 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
178f0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
17900 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
17910 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
17920 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
17930 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
17940 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
17950 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
17960 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
17970 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
17980 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
17990 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
179a0 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
179b0 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
179c0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
179d0 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
179e0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
179f0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
17a00 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
17a10 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
17a20 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
17a30 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
17a40 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
17a50 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
17a60 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
17a70 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
17a80 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
17a90 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
17aa0 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
17ab0 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
17ac0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
17ad0 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
17ae0 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
17af0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
17b00 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
17b10 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
17b20 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
17b30 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
17b40 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
17b50 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
17b60 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
17b70 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
17b80 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
17b90 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
17ba0 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
17bb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17bc0 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
17bd0 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
17be0 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
17bf0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
17c00 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
17c10 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
17c20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
17c30 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
17c40 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
17c50 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
17c60 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
17c70 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
17c80 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
17c90 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
17ca0 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
17cb0 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
17cc0 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
17cd0 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
17ce0 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
17cf0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
17d00 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
17d10 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
17d20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
17d30 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
17d40 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
17d50 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
17d60 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
17d70 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
17d80 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
17d90 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
17da0 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
17db0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
17dc0 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
17dd0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17de0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
17df0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
17e00 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
17e10 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
17e20 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
17e30 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
17e40 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
17e50 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
17e60 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
17e70 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
17e80 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
17e90 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17ea0 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
17eb0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
17ec0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
17ed0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
17ee0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
17ef0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
17f00 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
17f10 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
17f20 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
17f30 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
17f40 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
17f50 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
17f60 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
17f70 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
17f80 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
17f90 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
17fa0 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
17fb0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
17fc0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
17fd0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
17fe0 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
17ff0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18000 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
18010 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
18020 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
18030 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
18040 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
18050 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
18060 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
18070 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
18080 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
18090 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
180a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
180b0 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
180c0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
180d0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
180e0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
180f0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
18100 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18110 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
18120 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
18130 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18140 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
18150 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18160 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
18170 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18180 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
18190 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
181a0 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
181b0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
181c0 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
181d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
181e0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
181f0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
18200 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18210 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
18220 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
18230 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
18240 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
18250 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
18260 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18270 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18280 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
18290 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
182a0 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
182b0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
182c0 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
182d0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
182e0 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
182f0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
18300 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
18310 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
18320 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18330 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
18340 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18350 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
18360 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
18370 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
18380 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
18390 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
183a0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
183b0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
183c0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
183d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
183e0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
183f0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
18400 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
18410 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
18420 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
18430 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
18440 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
18450 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
18460 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
18470 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
18480 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
18490 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
184a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
184b0 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
184c0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
184d0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
184e0 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
184f0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
18500 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
18510 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
18520 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
18530 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
18540 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
18550 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18570 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
18580 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
18590 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
185a0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
185b0 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
185c0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
185d0 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
185e0 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
185f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
18600 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
18610 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
18620 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
18630 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
18640 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
18650 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
18660 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
18670 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
18680 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
18690 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
186a0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
186b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
186c0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
186d0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
186e0 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
186f0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
18700 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
18710 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
18720 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
18730 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18740 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
18750 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
18760 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
18770 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
18780 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
18790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
187a0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
187b0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
187c0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
187d0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
187e0 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
187f0 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
18800 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
18810 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
18820 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
18830 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
18840 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
18850 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
18860 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
18870 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
18880 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
18890 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
188a0 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
188b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
188c0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
188d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
188e0 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
188f0 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
18900 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
18910 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
18920 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
18930 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
18940 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
18950 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
18960 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
18970 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
18980 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
18990 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
189a0 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
189b0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
189c0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
189d0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
189e0 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
189f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18a00 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
18a10 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
18a20 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
18a30 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
18a40 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
18a50 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
18a60 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
18a70 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
18a80 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
18a90 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
18aa0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
18ab0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
18ac0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18ad0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
18ae0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
18af0 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
18b00 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
18b10 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
18b20 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
18b30 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
18b40 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
18b50 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18b60 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
18b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18b80 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
18b90 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
18ba0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
18bb0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
18bc0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
18bd0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
18be0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18bf0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
18c00 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
18c10 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
18c20 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
18c30 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
18c40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
18c50 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
18c60 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
18c70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
18c80 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
18c90 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
18ca0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
18cb0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
18cc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
18cd0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
18ce0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
18cf0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
18d00 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
18d10 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
18d20 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
18d30 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
18d40 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
18d50 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
18d60 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
18d70 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
18d80 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
18d90 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
18da0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
18db0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
18dc0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
18dd0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
18de0 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
18df0 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
18e00 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
18e10 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
18e20 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
18e30 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
18e40 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
18e50 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
18e60 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
18e70 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
18e80 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
18e90 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
18ea0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
18eb0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
18ec0 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
18ed0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
18ee0 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
18ef0 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
18f00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18f10 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18f20 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
18f30 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
18f40 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
18f50 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18f60 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  ByCol - 1;.    }
18f70 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
18f80 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
18f90 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
18fa0 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  e, p, 1);.  }els
18fb0 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
18fc0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
18fd0 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
18fe0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
18ff0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
19000 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
19010 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
19020 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
19030 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
19040 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
19050 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
19060 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
19070 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
19080 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
19090 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
190a0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
190b0 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
190c0 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
190d0 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
190e0 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
190f0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
19100 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
19110 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
19120 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
19130 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
19140 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
19150 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
19160 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
19170 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
19180 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
19190 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
191a0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
191b0 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
191c0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
191d0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70  se->nMem += nExp
191e0 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r+1;.    sqlite3
191f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19200 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
19210 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44  Prev);.    pKeyD
19220 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  up = sqlite3KeyI
19230 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
19240 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
19250 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20  pKeyDup ){.     
19260 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19270 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
19280 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20  le(pKeyDup) );. 
19290 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
192a0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
192b0 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43       pKeyDup->aC
192c0 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
192d0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
192e0 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
192f0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
19300 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20  tOrder[i] = 0;. 
19310 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19320 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65  . .  /* Separate
19330 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68   the left and th
19340 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72  e right query fr
19350 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20  om one another. 
19360 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
19370 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  = 0;.  pPrior->p
19380 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Next = 0;.  sqli
19390 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
193a0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
193b0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
193c0 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
193d0 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
193e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
193f0 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
19400 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
19410 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
19420 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
19430 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
19440 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
19450 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
19460 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
19470 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
19480 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
19490 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
194a0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
194b0 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
194c0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
194d0 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
194e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
194f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19500 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
19510 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
19520 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19550 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
19560 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19570 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
19580 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
19590 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
195a0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
195b0 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
195c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
195d0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
195e0 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
195f0 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
19600 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
19610 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
19620 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
19630 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
19640 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
19650 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
19660 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
19670 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
19680 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
19690 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
196a0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
196b0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
196c0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
196d0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
196e0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
196f0 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
19700 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19710 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
19720 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
19730 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
19740 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19750 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
19760 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
19770 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
19780 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
19790 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41  */.  addrSelectA
197a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
197b0 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
197c0 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33  ;.  j1 = sqlite3
197d0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
197e0 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
197f0 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64  regAddrA, 0, add
19800 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62  rSelectA);.  Vdb
19810 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65  eComment((v, "le
19820 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
19830 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
19840 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78   regLimitA;.  ex
19850 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
19860 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
19870 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
19880 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
19890 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
198a0 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
198b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
198c0 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  P_EndCoroutine, 
198d0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
198e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
198f0 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20 47  (v, j1);..  /* G
19900 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
19910 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
19920 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
19930 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
19940 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
19950 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
19960 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
19970 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19980 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a  Addr(v) + 1;.  j
19990 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
199a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
199b0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
199c0 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drB, 0, addrSele
199d0 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctB);.  VdbeComm
199e0 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53  ent((v, "right S
199f0 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
19a00 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
19a10 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
19a20 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
19a30 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
19a40 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
19a50 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65  ffset = 0;  .  e
19a60 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
19a70 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
19a80 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
19a90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
19aa0 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
19ab0 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
19ac0 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
19ad0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
19ae0 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
19af0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
19b00 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
19b10 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
19b20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
19b30 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
19b40 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
19b50 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20  t row of the A. 
19b60 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
19b70 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
19b80 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
19b90 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
19ba0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
19bb0 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
19bc0 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20  tine for A"));. 
19bd0 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65   addrOutA = gene
19be0 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
19bf0 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
19c10 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20   &destA, pDest, 
19c20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20  regOutA,.       
19c30 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
19c40 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65  v, pKeyDup, labe
19c50 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
19c60 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
19c70 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
19c80 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
19c90 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
19ca0 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
19cb0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
19cc0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
19cd0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
19ce0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
19cf0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
19d00 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
19d10 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
19d20 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
19d30 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
19d40 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
19d50 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
19d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19d70 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
19d80 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
19da0 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
19db0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20  labelEnd);.  }. 
19dc0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
19dd0 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a  nref(pKeyDup);..
19de0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19df0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
19e00 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
19e10 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41  ts from select A
19e20 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
19e30 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
19e40 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65  a in select B re
19e50 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
19e60 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
19e70 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
19e80 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
19e90 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f  ofA_noB = addrEo
19ea0 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20  fA = labelEnd;. 
19eb0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
19ec0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19ed0 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74  , "eof-A subrout
19ee0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
19ef0 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64  EofA = sqlite3Vd
19f00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
19f10 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
19f20 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64  ddrOutB);.    ad
19f30 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c  drEofA_noB = sql
19f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19f50 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
19f60 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrB, labelEnd);
19f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
19fa0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
19fb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19fc0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
19fd0 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
19fe0 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
19ff0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
1a000 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1a010 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1a020 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1a030 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1a040 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
1a050 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1a060 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1a070 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
1a080 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
1a090 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1a0a0 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
1a0b0 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
1a0c0 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
1a0d0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
1a0e0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1a0f0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1a100 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
1a110 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1a120 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
1a130 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1a140 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
1a150 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a160 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1a170 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1a180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a190 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a1a0 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62  d, regAddrA, lab
1a1b0 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  elEnd); VdbeCove
1a1c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1a1d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a1e0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
1a1f0 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
1a200 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1a210 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1a220 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
1a230 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1a240 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
1a250 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1a260 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
1a270 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a280 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1a290 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
1a2a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a2b0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1a2c0 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1a2d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a2e0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1a2f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a300 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
1a310 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1a320 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1a330 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
1a340 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
1a350 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
1a360 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
1a370 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
1a380 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1a390 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1a3a0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
1a3b0 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
1a3c0 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
1a3d0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1a3e0 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
1a3f0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
1a400 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
1a410 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a420 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1a430 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1a440 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a450 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a460 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1a470 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1a480 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1a490 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1a4a0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
1a4b0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1a4c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
1a4d0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1a4e0 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
1a4f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1a500 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
1a510 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
1a520 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
1a530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a540 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1a550 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1a560 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
1a570 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a580 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a590 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1a5a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a5b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a5c0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1a5d0 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
1a5e0 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
1a5f0 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
1a600 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
1a610 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
1a620 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1a630 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
1a640 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a650 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1a660 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20   addrEofA_noB); 
1a670 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a680 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a690 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a6a0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1a6b0 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1a6c0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d  age(v);..  /* Im
1a6d0 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
1a6e0 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
1a6f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1a700 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1a710 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
1a720 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a730 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
1a740 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
1a750 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
1a760 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
1a770 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a780 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
1a790 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
1a7a0 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7c0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1a7d0 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
1a7e0 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
1a7f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1a800 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
1a810 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1a820 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
1a830 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
1a840 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
1a850 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a860 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
1a870 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
1a880 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
1a890 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
1a8a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a8b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a8c0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
1a8d0 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
1a8e0 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75  r of output colu
1a8f0 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
1a900 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1a910 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53  _Output ){.    S
1a920 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
1a930 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c  pPrior;.    whil
1a940 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
1a950 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
1a960 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
1a970 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
1a980 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
1a990 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
1a9a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73  .  }..  /* Reass
1a9b0 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
1a9c0 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
1a9d0 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
1a9e0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1a9f0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1aa00 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
1aa10 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1aa20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1aa30 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
1aa40 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
1aa50 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1aa60 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1aa70 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42   = p;..  /*** TB
1aa80 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
1aa90 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
1aaa0 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
1aab0 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
1aac0 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
1aad0 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  */.  explainComp
1aae0 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
1aaf0 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
1ab00 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  2, 0);.  return 
1ab10 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b  pParse->nErr!=0;
1ab20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
1ab30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ab40 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1ab50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1ab60 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
1ab70 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1ab80 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1ab90 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1aba0 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
1abb0 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
1abc0 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1abd0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
1abe0 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
1abf0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
1ac00 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
1ac10 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
1ac20 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
1ac30 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
1ac40 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
1ac50 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
1ac60 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
1ac70 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1ac80 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
1ac90 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
1aca0 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
1acb0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
1acc0 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
1acd0 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
1ace0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1acf0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
1ad00 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
1ad10 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
1ad20 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
1ad30 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
1ad40 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
1ad50 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
1ad60 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
1ad70 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
1ad80 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
1ad90 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1ada0 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
1adb0 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
1adc0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
1add0 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
1ade0 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
1adf0 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
1ae00 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
1ae10 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
1ae20 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
1ae30 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
1ae40 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
1ae50 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
1ae60 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
1ae70 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
1ae80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1ae90 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1aea0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f  malloc errors to
1aeb0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1aec0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1aed0 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  r,        /* Exp
1aee0 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74  r in which subst
1aef0 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a  itution occurs *
1af00 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1af10 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1af20 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
1af30 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1af40 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53   *pEList    /* S
1af50 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73  ubstitute expres
1af60 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  sions */.){.  if
1af70 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1af80 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
1af90 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1afa0 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
1afb0 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
1afc0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
1afd0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1afe0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
1aff0 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
1b000 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
1b010 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b020 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
1b030 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
1b040 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1b050 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1b060 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
1b070 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
1b080 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
1b090 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1b0a0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  , pEList->a[pExp
1b0b0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1b0c0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
1b0d0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1b0e0 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
1b0f0 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1b100 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1b110 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
1b120 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b130 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
1b140 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b150 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1b160 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b170 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
1b180 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b190 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1b1a0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1b1b0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1b1c0 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1b1d0 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
1b1e0 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1b1f0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  pEList);.    }el
1b200 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45  se{.      substE
1b210 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70  xprList(db, pExp
1b220 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  r->x.pList, iTab
1b230 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b240 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b250 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
1b260 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1b270 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
1b280 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
1b290 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
1b2a0 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
1b2b0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
1b2c0 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
1b2d0 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
1b2e0 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1b2f0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
1b300 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1b310 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
1b320 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
1b330 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
1b340 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
1b350 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
1b360 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1b370 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1b380 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1b390 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1b3a0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1b3b0 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1b3c0 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
1b3d0 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
1b3e0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
1b3f0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1b400 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74  tSelect(.  sqlit
1b410 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1b420 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1b430 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
1b440 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1b450 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
1b460 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1b470 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1b480 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
1b490 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1b4a0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1b4b0 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20  be replaced */. 
1b4c0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1b4d0 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
1b4e0 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
1b4f0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1b500 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1b510 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1b520 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
1b530 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75  p ) return;.  su
1b540 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b550 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c  p->pEList, iTabl
1b560 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
1b570 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b580 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61  p->pGroupBy, iTa
1b590 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b5a0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b5b0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  , p->pOrderBy, i
1b5c0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b5d0 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1b5e0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
1b5f0 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c  pHaving, iTable,
1b600 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
1b610 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1b620 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  r(db, p->pWhere,
1b630 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b640 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28  ;.  substSelect(
1b650 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  db, p->pPrior, i
1b660 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b670 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1b680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1b690 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72   );  /* Even for
1b6a0 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20 68   (SELECT 1) we h
1b6b0 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74  ave: pSrc!=0 but
1b6c0 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a   pSrc->nSrc==0 *
1b6d0 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1b6e0 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  Src) ){.    for(
1b6f0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1b700 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1b710 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1b720 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1b730 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  ct(db, pItem->pS
1b740 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
1b750 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1b760 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
1b770 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b780 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1b790 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b7a0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
1b7b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1b7c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1b7d0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1b7e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1b7f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1b800 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
1b810 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
1b820 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
1b830 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
1b840 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b850 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
1b860 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
1b870 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
1b880 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
1b890 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
1b8a0 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
1b8b0 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
1b8c0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1b8d0 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
1b8e0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
1b8f0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
1b900 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1b910 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
1b920 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
1b930 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
1b940 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
1b950 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
1b960 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
1b970 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
1b980 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1b990 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1b9a0 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
1b9b0 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
1b9c0 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
1b9d0 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
1b9e0 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
1b9f0 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
1ba00 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
1ba10 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
1ba20 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1ba30 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
1ba40 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
1ba50 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
1ba60 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
1ba70 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
1ba80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ba90 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1baa0 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
1bab0 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
1bac0 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
1bad0 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
1bae0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1baf0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
1bb00 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1bb10 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
1bb20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1bb30 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1bb40 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  is simplificatio
1bb50 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1bb60 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1bb70 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1bb80 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1bb90 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1bba0 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1bbb0 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1bbc0 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1bbd0 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1bbe0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1bbf0 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1bc00 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
1bc10 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
1bc20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1bc30 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1bc40 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
1bc50 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1bc60 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1bc70 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
1bc80 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
1bc90 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bca0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1bcb0 74 65 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f  te or (2a) the o
1bcc0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1bcd0 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  t a join.**     
1bce0 20 20 20 61 6e 64 20 28 32 62 29 20 74 68 65 20     and (2b) the 
1bcf0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1bd00 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72   not use subquer
1bd10 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ies other than t
1bd20 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  he one.**       
1bd30 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1bd40 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1bd50 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c  candidate for fl
1bd60 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69  attening.  (2b i
1bd70 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20  s.**        due 
1bd80 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37  to ticket [2f717
1bd90 30 64 37 33 62 66 39 61 62 66 38 30 5d 20 66 72  0d73bf9abf80] fr
1bda0 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a  om 2015-02-09.).
1bdb0 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
1bdc0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1bdd0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1bde0 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1bdf0 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20  er join.**      
1be00 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69    (Originally ti
1be10 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65  cket #306.  Stre
1be20 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b  ngthened by tick
1be30 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20  et #3300).**.** 
1be40 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75    (4)  The subqu
1be50 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
1be60 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  NCT..**.**  (**)
1be70 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72    At one point r
1be80 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20  estrictions (4) 
1be90 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20  and (5) defined 
1bea0 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54  a subset of DIST
1beb0 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73  INCT.**        s
1bec0 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20  ub-queries that 
1bed0 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72  were excluded fr
1bee0 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  om this optimiza
1bef0 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f  tion. Restrictio
1bf00 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29  n .**        (4)
1bf10 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20   has since been 
1bf20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c  expanded to excl
1bf30 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54  ude all DISTINCT
1bf40 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a   subqueries..**.
1bf50 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
1bf60 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1bf70 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
1bf80 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1bf90 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
1bfa0 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
1bfb0 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
1bfc0 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
1bfd0 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a  M clause.  TODO:
1bfe0 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73    For subqueries
1bff0 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20   without.**     
1c000 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65     A FROM clause
1c010 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e  , consider addin
1c020 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77  g a FROM close w
1c030 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1c040 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1c050 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1c060 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1c070 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1c080 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1c090 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1c0a0 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
1c0b0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c0c0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c0d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1c0e0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
1c0f0 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
1c100 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c110 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1c120 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1c130 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
1c140 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
1c150 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1c160 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1c170 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1c180 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1c190 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1c1a0 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1c1b0 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1c1c0 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1c1d0 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1c1e0 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1c1f0 20 20 20 20 74 65 78 74 3a 20 22 54 68 65 20 73      text: "The s
1c200 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c210 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1c220 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c230 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 64 6f  ry .**        do
1c240 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1c250 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1c260 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1c270 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c280 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
1c290 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c2a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1c2b0 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1c2c0 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1c2d0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1c2e0 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1c2f0 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1c300 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1c310 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1c320 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
1c330 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
1c340 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
1c350 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1c360 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
1c370 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
1c380 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c390 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
1c3a0 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
1c3b0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1c3c0 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
1c3d0 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
1c3e0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
1c3f0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
1c400 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  ave a LIMIT clau
1c410 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  se..**        (S
1c420 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20  ee ticket #2339 
1c430 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38  and ticket [02a8
1c440 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20  e81d44])..**.** 
1c450 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72   (16)  The outer
1c460 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e   query is not an
1c470 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
1c480 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a  e subquery does.
1c490 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f  **        not co
1c4a0 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20  ntain ORDER BY. 
1c4b0 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
1c4c0 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
1c4d0 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
1c4e0 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
1c4f0 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
1c500 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
1c510 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
1c520 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79  )  The sub-query
1c530 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75   is not a compou
1c540 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74  nd select, or it
1c550 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
1c560 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1c570 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20  und clause made 
1c580 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e  up entirely of n
1c590 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
1c5a0 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20  ries, and .**   
1c5b0 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20       the parent 
1c5c0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1c5d0 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69        * is not i
1c5e0 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20  tself part of a 
1c5f0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1c600 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1c610 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1c620 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71  te or DISTINCT q
1c630 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  uery, and.**    
1c640 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
1c650 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   join.**.**     
1c660 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
1c670 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
1c680 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
1c690 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
1c6a0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
1c6b0 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
1c6c0 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
1c6d0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
1c6e0 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
1c6f0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1c700 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  T clauses.  The 
1c710 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  subquery cannot 
1c720 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  use any compound
1c730 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
1c740 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55  tor other than U
1c750 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65  NION ALL because
1c760 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
1c770 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1c780 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65    operators have
1c790 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54   an implied DIST
1c7a0 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69  INCT which is di
1c7b0 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20  sallowed by.**  
1c7c0 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f        restrictio
1c7d0 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  n (4)..**.**    
1c7e0 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63      Also, each c
1c7f0 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20  omponent of the 
1c800 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72  sub-query must r
1c810 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e  eturn the same n
1c820 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
1c830 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
1c840 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61  s. This is actua
1c850 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e  lly a requiremen
1c860 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75  t for any compou
1c870 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  nd.**        SEL
1c880 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ECT statement, b
1c890 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20  ut all the code 
1c8a0 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b  here does is mak
1c8b0 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a  e sure that no.*
1c8c0 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69  *        such (i
1c8d0 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72  llegal) sub-quer
1c8e0 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20  y is flattened. 
1c8f0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
1c900 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20  detect the.**   
1c910 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f       syntax erro
1c920 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  r and return a d
1c930 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e  etailed message.
1c940 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
1c950 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1c960 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1c970 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
1c980 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
1c990 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c       ORDER by cl
1c9a0 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
1c9b0 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
1c9c0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1c9d0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
1c9e0 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
1c9f0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
1ca00 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1ca10 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1ca20 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1ca30 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
1ca40 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
1ca50 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
1ca60 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
1ca70 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1ca80 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1ca90 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
1caa0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
1cab0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1cac0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
1cad0 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
1cae0 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
1caf0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
1cb00 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
1cb10 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
1cb20 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1cb30 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
1cb40 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
1cb50 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
1cb60 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1cb70 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
1cb80 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
1cb90 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
1cba0 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
1cbb0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
1cbc0 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
1cbd0 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  21)  The subquer
1cbe0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1cbf0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1cc00 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
1cc10 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
1cc20 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
1cc30 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
1cc40 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20  *.**  (22)  The 
1cc50 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1cc60 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
1cc70 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68  .**.**  (23)  Th
1cc80 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20  e parent is not 
1cc90 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c  a recursive CTE,
1cca0 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72   or the sub-quer
1ccb0 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20  y is not a.**   
1ccc0 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75       compound qu
1ccd0 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69  ery. This restri
1cce0 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ction is because
1ccf0 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
1cd00 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65  e.**        pare
1cd10 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64  nt to a compound
1cd20 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20   query confuses 
1cd30 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61  the code that ha
1cd40 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndles.**        
1cd50 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
1cd60 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  s in multiSelect
1cd70 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20  ()..**.**  (24) 
1cd80 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1cd90 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1cda0 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
1cdb0 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f  built-in min() o
1cdc0 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20  r .**        or 
1cdd0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  max() functions.
1cde0 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20    (Without this 
1cdf0 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71  restriction, a q
1ce00 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20  uery like:.**   
1ce10 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46       "SELECT x F
1ce20 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28  ROM (SELECT max(
1ce30 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20  y), x FROM t1)" 
1ce40 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73  would not necess
1ce50 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  arily.**        
1ce60 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
1ce70 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77   X for which Y w
1ce80 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a  as maximal.).**.
1ce90 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
1cea0 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
1ceb0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
1cec0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
1ced0 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
1cee0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
1cef0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
1cf00 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
1cf10 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1cf20 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
1cf30 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
1cf40 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
1cf50 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1cf60 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
1cf70 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
1cf80 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
1cf90 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
1cfa0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
1cfb0 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
1cfc0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1cfd0 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
1cfe0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1cff0 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
1d000 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
1d010 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
1d020 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
1d030 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
1d040 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
1d050 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1d060 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
1d070 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
1d080 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  bquery(.  Parse 
1d090 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
1d0a0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1d0b0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1d0c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1d0d0 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
1d0e0 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
1d0f0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
1d100 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
1d110 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
1d120 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
1d130 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
1d140 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
1d150 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d160 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
1d170 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1d180 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
1d190 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
1d1a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1d1b0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1d1c0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1d1d0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
1d1e0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
1d1f0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
1d200 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
1d210 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
1d220 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  nt;.  Select *pS
1d230 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
1d240 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
1d250 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
1d260 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
1d270 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1d280 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
1d290 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
1d2a0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1d2b0 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
1d2c0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1d2d0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1d2e0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1d2f0 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
1d300 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1d310 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
1d320 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1d330 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
1d340 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1d350 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1d360 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
1d370 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
1d380 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
1d390 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
1d3a0 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
1d3b0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1d3c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1d3d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
1d3e0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d400 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1d410 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1d420 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
1d430 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
1d440 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
1d450 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1d460 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ->db;..  /* Chec
1d470 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
1d480 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1d490 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
1d4a0 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  f not..  */.  as
1d4b0 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
1d4c0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
1d4d0 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62  r==0 );  /* Unab
1d4e0 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f  le to flatten co
1d4f0 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a  mpound queries *
1d500 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
1d510 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1d520 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
1d530 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
1d540 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
1d550 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1d560 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
1d570 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
1d580 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
1d590 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
1d5a0 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
1d5b0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
1d5c0 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
1d5d0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1d5e0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
1d5f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71  =0 );.  if( subq
1d600 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1d610 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65 74   if( isAgg ) ret
1d620 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d650 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20  tion (1)   */.  
1d660 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
1d670 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d6a0 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20  ction (2a)  */. 
1d6b0 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72     if( (p->pWher
1d6c0 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  e && ExprHasProp
1d6d0 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45  erty(p->pWhere,E
1d6e0 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20 20  P_Subquery)).   
1d6f0 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70    || (sqlite3Exp
1d700 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45  rListFlags(p->pE
1d710 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71 75  List) & EP_Subqu
1d720 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ery)!=0.     || 
1d730 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  (sqlite3ExprList
1d740 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42  Flags(p->pOrderB
1d750 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79  y) & EP_Subquery
1d760 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
1d770 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d7b0 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20  ion (2b)  */.   
1d7c0 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53   }.  }.    .  pS
1d7d0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1d7e0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1d7f0 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1d800 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1d810 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1d820 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1d830 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1d840 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1d850 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1d860 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
1d870 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
1d880 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
1d890 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
1d8a0 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
1d8b0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
1d8c0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
1d8d0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1d8e0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
1d8f0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
1d900 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
1d910 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
1d920 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
1d930 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
1d940 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1d950 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
1d960 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
1d970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d980 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
1d990 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1d9a0 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
1d9b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d9d0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
1d9e0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1d9f0 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
1da00 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
1da10 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
1da20 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da50 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1da60 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
1da70 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1da80 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
1da90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1daa0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dab0 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
1dac0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1dad0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1dae0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1daf0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1db00 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20  iction (5)  */. 
1db10 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1db20 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
1db30 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
1db40 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1db50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1db60 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
1db70 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1db80 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1db90 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
1dba0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1dbb0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1dbc0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dbd0 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
1dbe0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1dbf0 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1dc00 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1dc10 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1dc50 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1dc60 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1dc70 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1dc80 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1dc90 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1dca0 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1dcb0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1dcc0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1dcd0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1dce0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1dcf0 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1dd00 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1dd10 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1dd20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1dd30 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1dd40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1dd50 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1dd60 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
1dd70 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1dd80 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
1dd90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  ;.  testcase( pS
1dda0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1ddb0 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20  F_MinMaxAgg );. 
1ddc0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1ddd0 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
1dde0 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67  ive|SF_MinMaxAgg
1ddf0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1de00 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1de10 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29  ns (22) and (24)
1de20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1de30 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1de40 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53  Recursive) && pS
1de50 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1de60 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1de70 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20  estriction (23) 
1de80 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53  */.  }..  /* OBS
1de90 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
1dea0 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
1deb0 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
1dec0 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
1ded0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1dee0 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
1def0 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
1df00 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1df10 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
1df20 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
1df30 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
1df40 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1df50 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1df60 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1df70 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
1df80 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1df90 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1dfa0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1dfb0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1dfc0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1dfd0 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
1dfe0 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
1dff0 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
1e000 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
1e010 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
1e020 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
1e030 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
1e040 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1e050 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1e060 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1e070 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
1e080 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1e090 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
1e0a0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
1e0b0 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
1e0c0 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1e0d0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1e0e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1e0f0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1e100 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
1e110 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
1e120 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
1e130 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
1e140 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
1e150 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1e160 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
1e170 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
1e180 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
1e190 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
1e1a0 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
1e1b0 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
1e1c0 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
1e1d0 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
1e1e0 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
1e1f0 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
1e200 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
1e210 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
1e220 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
1e230 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
1e240 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
1e250 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
1e260 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
1e270 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1e280 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
1e290 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
1e2a0 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
1e2b0 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
1e2c0 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
1e2d0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1e2e0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
1e2f0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1e300 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
1e310 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
1e320 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67  f( (pSubitem->fg
1e330 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
1e340 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
1e350 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1e360 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e370 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  17: If the sub-q
1e380 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1e390 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
1e3a0 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
1e3b0 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
1e3c0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
1e3d0 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
1e3e0 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
1e3f0 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
1e400 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
1e410 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
1e420 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
1e430 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
1e440 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
1e450 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1e460 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
1e470 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1e480 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
1e490 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
1e4a0 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d  tion 20 */.    }
1e4b0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
1e4c0 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1e4d0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1e4e0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
1e4f0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
1e500 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
1e510 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
1e520 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
1e530 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
1e540 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1e550 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1e560 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1e570 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
1e580 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
1e590 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1e5a0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1e5b0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1e5c0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
1e5d0 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
1e5e0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1e5f0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
1e600 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
1e610 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
1e620 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
1e630 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
1e640 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1e650 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1e660 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
1e670 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
1e680 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
1e690 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
1e6a0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
1e6b0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20  ->pSrc->nSrc<1. 
1e6c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1e6d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1e6e0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
1e6f0 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
1e700 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
1e710 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e720 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66  on 18. */.    if
1e730 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
1e740 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
1e750 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1e760 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
1e770 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1e780 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
1e790 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
1e7a0 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
1e7b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1e7c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1e7d0 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
1e7e0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
1e7f0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1e800 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20  mitted. *****/. 
1e810 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
1e820 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65  Parse,p,("flatte
1e830 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72  n %s.%p from ter
1e840 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m %d\n",.       
1e850 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
1e860 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62  ->zSelName, pSub
1e870 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
1e880 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
1e890 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
1e8a0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1e8b0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
1e8c0 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
1e8d0 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
1e8e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1e8f0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1e900 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
1e910 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
1e920 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
1e930 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
1e940 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
1e950 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
1e960 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1e970 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
1e980 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
1e990 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
1e9a0 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
1e9b0 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
1e9c0 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
1e9d0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1e9e0 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
1e9f0 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
1ea00 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1ea10 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
1ea20 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
1ea30 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
1ea40 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
1ea50 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
1ea60 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
1ea70 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1ea80 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
1ea90 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
1eaa0 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
1eab0 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
1eac0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1ead0 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
1eae0 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
1eaf0 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
1eb00 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
1eb10 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
1eb20 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
1eb30 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
1eb40 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
1eb50 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1eb60 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
1eb70 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
1eb80 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
1eb90 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
1eba0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
1ebb0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1ebc0 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
1ebd0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
1ebe0 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
1ebf0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
1ec00 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1ec10 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
1ec20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1ec30 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1ec40 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
1ec50 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
1ec60 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
1ec70 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
1ec80 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
1ec90 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
1eca0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
1ecb0 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
1ecc0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
1ecd0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1ece0 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
1ecf0 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
1ed00 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1ed10 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1ed20 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
1ed30 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
1ed40 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
1ed50 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
1ed60 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
1ed70 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
1ed80 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1ed90 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
1eda0 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
1edb0 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
1edc0 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
1edd0 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
1ede0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
1edf0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
1ee00 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1ee10 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
1ee20 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
1ee30 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20  Expr *pOffset = 
1ee40 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
1ee50 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
1ee60 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
1ee70 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
1ee80 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
1ee90 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
1eea0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
1eeb0 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  it = 0;.    p->p
1eec0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
1eed0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
1eee0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30  lectDup(db, p, 0
1eef0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1ef00 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77  lectSetName(pNew
1ef10 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65  , pSub->zSelName
1ef20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  );.    p->pOffse
1ef30 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
1ef40 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
1ef50 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
1ef60 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1ef70 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
1ef80 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
1ef90 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
1efa0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1efb0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1efc0 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
1efd0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
1efe0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1eff0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
1f000 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1f010 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
1f020 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
1f030 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1f040 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
1f050 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
1f060 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63  ,p,.         ("c
1f070 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1f080 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74   flattener creat
1f090 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
1f0a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e  \n",.         pN
1f0b0 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e  ew->zSelName, pN
1f0c0 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew));.    }.    
1f0d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1f0e0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1f0f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1f100 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1f110 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
1f120 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1f130 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
1f140 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
1f150 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
1f160 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1f170 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
1f180 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
1f190 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
1f1a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f1b0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1f1c0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
1f1d0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1f1e0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1f1f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f200 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1f210 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
1f220 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1f230 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1f240 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
1f250 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
1f260 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
1f270 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
1f280 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
1f290 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
1f2a0 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
1f2b0 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
1f2c0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1f2d0 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
1f2e0 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
1f2f0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
1f300 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
1f310 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
1f320 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
1f330 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
1f340 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
1f350 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
1f360 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
1f370 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
1f380 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
1f390 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
1f3a0 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
1f3b0 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
1f3c0 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
1f3d0 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
1f3e0 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
1f3f0 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
1f400 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
1f410 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
1f420 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
1f430 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31  abToDel->nRef==1
1f440 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
1f450 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1f460 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1f470 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
1f480 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
1f490 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
1f4a0 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
1f4b0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
1f4c0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
1f4d0 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
1f4e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
1f4f0 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  oDel->nRef--;.  
1f500 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
1f510 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
1f520 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1f530 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
1f540 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
1f550 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
1f560 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
1f570 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
1f580 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
1f590 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1f5a0 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
1f5b0 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
1f5c0 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
1f5d0 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
1f5e0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1f5f0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
1f600 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
1f610 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
1f620 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
1f630 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
1f640 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
1f650 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
1f660 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
1f670 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
1f680 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1f690 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
1f6a0 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
1f6b0 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
1f6c0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
1f6d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
1f6e0 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
1f6f0 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
1f700 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
1f710 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
1f720 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
1f730 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
1f740 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
1f750 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
1f760 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
1f770 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
1f780 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
1f790 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
1f7a0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
1f7b0 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
1f7c0 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
1f7d0 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
1f7e0 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
1f7f0 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
1f800 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
1f810 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
1f820 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
1f830 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
1f840 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
1f850 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20      u8 jointype 
1f860 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63  = 0;.    pSubSrc
1f870 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
1f880 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
1f890 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
1f8a0 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
1f8b0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
1f8c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1f8d0 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
1f8e0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
1f8f0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
1f900 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
1f910 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1f920 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1f930 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
1f940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f950 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
1f960 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
1f970 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1f980 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
1f990 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f   pSubitem->fg.jo
1f9a0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
1f9b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1f9c0 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
1f9d0 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
1f9e0 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
1f9f0 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1fa00 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
1fa10 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
1fa20 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1fa30 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
1fa40 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
1fa50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1fa60 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1fa70 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
1fa80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1fa90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1faa0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fab0 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
1fac0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1fad0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
1fae0 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
1faf0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1fb00 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
1fb10 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
1fb20 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
1fb30 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
1fb40 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
1fb50 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1fb60 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
1fb70 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
1fb80 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1fb90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1fba0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1fbb0 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
1fbc0 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
1fbd0 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
1fbe0 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
1fbf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1fc00 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
1fc10 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
1fc20 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
1fc30 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
1fc40 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1fc50 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
1fc60 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
1fc70 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
1fc80 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
1fc90 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
1fca0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75  xpand the out qu
1fcb0 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20  ery to 4 slots. 
1fcc0 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20   The middle.    
1fcd0 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  ** slot is expan
1fce0 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
1fcf0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
1fd00 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a  e space for the.
1fd10 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65      ** two eleme
1fd20 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
1fd30 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1fd40 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
1fd50 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
1fd60 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1fd70 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
1fd80 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1fd90 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
1fda0 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
1fdb0 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
1fdc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1fdd0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1fde0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fdf0 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
1fe00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1fe10 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
1fe20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1fe30 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1fe40 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1fe50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
1fe60 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1fe70 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1fe80 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
1fe90 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
1fea0 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
1feb0 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
1fec0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1fed0 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
1fee0 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
1fef0 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
1ff00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
1ff10 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a  c->a[iFrom].fg.j
1ff20 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1ff30 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1ff40 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1ff50 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1ff60 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1ff70 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1ff80 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1ff90 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1ffa0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1ffb0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1ffc0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1ffd0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1ffe0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1fff0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
20000 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
20010 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
20020 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
20030 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
20040 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
20050 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
20060 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
20070 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
20080 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
20090 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
200a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
200b0 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
200c0 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
200d0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
200e0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
200f0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
20100 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
20110 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
20120 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
20130 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
20140 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
20150 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
20160 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
20170 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
20180 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20190 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
201a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
201b0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
201c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
201d0 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
201e0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
201f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
20200 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20210 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
20220 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
20230 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
20240 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
20250 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
20260 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
20270 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
20280 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
20290 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
202a0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
202b0 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
202c0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
202d0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
202e0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
202f0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
20300 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
20310 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
20320 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
20330 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
20340 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
20350 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
20360 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
20370 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
20380 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
20390 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
203a0 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
203b0 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
203c0 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
203d0 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
203e0 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
203f0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
20400 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
20410 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
20420 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
20430 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
20440 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
20450 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
20460 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
20470 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
20480 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
20490 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
204a0 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
204b0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
204c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
204d0 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
204e0 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
204f0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
20500 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
20510 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
20520 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
20530 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
20540 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
20550 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
20560 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
20570 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
20580 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
20590 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
205a0 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
205b0 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
205c0 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
205d0 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
205e0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
205f0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
20600 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
20610 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
20620 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
20630 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
20640 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
20650 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
20660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
20670 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
20680 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
20690 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
206a0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
206b0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
206c0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
206d0 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
206e0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
206f0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
20700 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
20710 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
20720 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
20730 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
20740 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
20750 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20760 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
20770 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
20780 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
20790 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
207a0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
207b0 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
207c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
207d0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
207e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
207f0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
20800 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
20810 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
20820 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
20830 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20840 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
20850 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20860 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
20870 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
20880 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
20890 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
208a0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
208b0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
208c0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
208d0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20900 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
20910 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
20920 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
20930 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
20940 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
20950 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
20960 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
20970 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
20980 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
20990 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
209a0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
209b0 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
209c0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
209d0 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
209e0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
209f0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
20a00 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
20a10 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
20a20 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
20a30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
20a40 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
20a50 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
20a60 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
20a70 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
20a80 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
20a90 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
20aa0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
20ab0 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
20ac0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
20ad0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
20ae0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
20af0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
20b00 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
20b10 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
20b20 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
20b30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
20b40 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
20b50 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
20b60 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
20b70 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
20b80 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
20b90 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
20ba0 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
20bb0 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
20bc0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
20bd0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
20be0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
20bf0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
20c00 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
20c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20c20 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
20c30 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
20c40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
20c50 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
20c60 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
20c70 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
20c80 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
20c90 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
20ca0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
20cb0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
20cc0 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
20cd0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
20ce0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
20cf0 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e  er flattening:\n
20d00 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
20d10 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
20d20 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
20d30 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b  dif..  return 1;
20d40 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
20d50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
20d60 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
20d70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20d80 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a  MIT_VIEW) */....
20d90 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
20da0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
20db0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
20dc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
20dd0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69  ./*.** Make copi
20de0 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57  es of relevant W
20df0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
20e00 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  s of the outer q
20e10 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65  uery into.** the
20e20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
20e30 20 73 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d   subquery.  Exam
20e40 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ple:.**.**    SE
20e50 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
20e60 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20  ECT a AS x, c-d 
20e70 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48  AS y FROM t1) WH
20e80 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30  ERE x=5 AND y=10
20e90 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72  ;.**.** Transfor
20ea0 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20  med into:.**.** 
20eb0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
20ec0 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c   (SELECT a AS x,
20ed0 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74   c-d AS y FROM t
20ee0 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20  1 WHERE a=5 AND 
20ef0 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57  c-d=10).**     W
20f00 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31  HERE x=5 AND y=1
20f10 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70  0;.**.** The hop
20f20 65 20 69 73 20 74 68 61 74 20 74 68 65 20 74 65  e is that the te
20f30 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  rms added to the
20f40 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c   inner query wil
20f50 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a  l make it more.*
20f60 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  * efficient..**.
20f70 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
20f80 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
20f90 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ion if:.**.**   
20fa0 28 31 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (1) The inner qu
20fb0 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67  ery is an aggreg
20fc0 61 74 65 2e 20 20 28 49 6e 20 74 68 61 74 20 63  ate.  (In that c
20fd0 61 73 65 2c 20 77 65 27 64 20 72 65 61 6c 6c 79  ase, we'd really
20fe0 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20 20 20 74   want.**       t
20ff0 6f 20 63 6f 70 79 20 74 68 65 20 6f 75 74 65 72  o copy the outer
21000 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65   WHERE-clause te
21010 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 48 41 56  rms onto the HAV
21020 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
21030 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 6e 65 72  e.**       inner
21040 20 71 75 65 72 79 2e 20 20 42 75 74 20 74 68 65   query.  But the
21050 79 20 70 72 6f 62 61 62 6c 79 20 77 6f 6e 27 74  y probably won't
21060 20 68 65 6c 70 20 74 68 65 72 65 20 73 6f 20 64   help there so d
21070 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e 29 0a 2a  o not bother.).*
21080 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69  *.**   (2) The i
21090 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68  nner query is th
210a0 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74  e recursive part
210b0 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62   of a common tab
210c0 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  le expression..*
210d0 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69  *.**   (3) The i
210e0 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61  nner query has a
210f0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73   LIMIT clause (s
21100 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73  ince the changes
21110 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a   to the WHERE.**
21120 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75         close wou
21130 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65  ld change the me
21140 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d  aning of the LIM
21150 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  IT)..**.**   (4)
21160 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
21170 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
21180 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
21190 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c  JOIN.  (The call
211a0 65 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f  er.**       enfo
211b0 72 63 65 73 20 74 68 69 73 20 72 65 73 74 72 69  rces this restri
211c0 63 74 69 6f 6e 20 73 69 6e 63 65 20 74 68 69 73  ction since this
211d0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
211e0 74 20 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a  t have enough.**
211f0 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69         informati
21200 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a  on to know.).**.
21210 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45  **   (5) The WHE
21220 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
21230 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20  sion originates 
21240 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
21250 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  NG clause.**    
21260 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49     of a LEFT JOI
21270 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  N..**.** Return 
21280 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20  0 if no changes 
21290 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e  are made and non
212a0 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20  -zero if one or 
212b0 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  more WHERE claus
212c0 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64  e.** terms are d
212d0 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74  uplicated into t
212e0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
212f0 73 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44  static int pushD
21300 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20  ownWhereTerms(. 
21310 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
21320 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
21330 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
21340 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 29  n (for malloc())
21350 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
21360 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ubq,        /* T
21370 68 65 20 73 75 62 71 75 65 72 79 20 77 68 6f 73  he subquery whos
21380 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
21390 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65  s to be augmente
213a0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
213b0 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
213c0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
213d0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
213e0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ery */.  int iCu
213f0 72 73 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rsor           /
21400 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
21410 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
21420 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
21430 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20  ew;.  int nChng 
21440 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72  = 0;.  if( pWher
21450 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
21460 0a 20 20 69 66 28 20 28 70 53 75 62 71 2d 3e 73  .  if( (pSubq->s
21470 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 41 67  elFlags & (SF_Ag
21480 67 72 65 67 61 74 65 7c 53 46 5f 52 65 63 75 72  gregate|SF_Recur
21490 73 69 76 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  sive))!=0 ){.   
214a0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
214b0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20  estrictions (1) 
214c0 61 6e 64 20 28 32 29 20 2a 2f 0a 20 20 7d 0a 20  and (2) */.  }. 
214d0 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d   if( pSubq->pLim
214e0 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65  it!=0 ){.     re
214f0 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72  turn 0; /* restr
21500 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20  iction (3) */.  
21510 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  }.  while( pWher
21520 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
21530 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75  .    nChng += pu
21540 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
21550 28 64 62 2c 20 70 53 75 62 71 2c 20 70 57 68 65  (db, pSubq, pWhe
21560 72 65 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72  re->pRight, iCur
21570 73 6f 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65  sor);.    pWhere
21580 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74   = pWhere->pLeft
21590 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72  ;.  }.  if( Expr
215a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65  HasProperty(pWhe
215b0 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  re,EP_FromJoin) 
215c0 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72  ) return 0; /* r
215d0 65 73 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a  estriction 5 */.
215e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
215f0 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
21600 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72  (pWhere, iCursor
21610 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b  ) ){.    nChng++
21620 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75  ;.    while( pSu
21630 62 71 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  bq ){.      pNew
21640 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
21650 70 28 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29  p(db, pWhere, 0)
21660 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
21670 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4e 65  ubstExpr(db, pNe
21680 77 2c 20 69 43 75 72 73 6f 72 2c 20 70 53 75 62  w, iCursor, pSub
21690 71 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  q->pEList);.    
216a0 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20    pSubq->pWhere 
216b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
216c0 28 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65  (db, pSubq->pWhe
216d0 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  re, pNew);.     
216e0 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e   pSubq = pSubq->
216f0 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  pPrior;.    }.  
21700 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67  }.  return nChng
21710 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
21720 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21730 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
21740 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21750 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f  OMIT_VIEW) */../
21760 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68  *.** Based on th
21770 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
21780 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
21790 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
217a0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
217b0 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e  gument, this fun
217c0 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
217d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
217e0 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
217f0 20 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e   * the query con
21800 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e  tains just a sin
21810 67 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75  gle aggregate fu
21820 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20  nction,.**    * 
21830 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
21840 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72  nction is either
21850 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c   min() or max(),
21860 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65   and.**    * the
21870 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
21880 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
21890 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
218a0 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  value..**.** If 
218b0 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
218c0 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20   are true, then 
218d0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
218e0 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
218f0 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74  BY_MAX.** is ret
21900 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72  urned as appropr
21910 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d  iate. Also, *ppM
21920 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  inMax is set to 
21930 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a  point to the .**
21940 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e   list of argumen
21950 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
21960 20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f 72   aggregate befor
21970 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
21980 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f  ** Or, if the co
21990 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61  nditions above a
219a0 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d  re not met, *ppM
219b0 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  inMax is set to 
219c0 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f  0 and.** WHERE_O
219d0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73  RDERBY_NORMAL is
219e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
219f0 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75  atic u8 minMaxQu
21a00 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67  ery(AggInfo *pAg
21a10 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20  gInfo, ExprList 
21a20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69  **ppMinMax){.  i
21a30 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f  nt eRet = WHERE_
21a40 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20  ORDERBY_NORMAL; 
21a50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
21a60 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a  rn value */..  *
21a70 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20  ppMinMax = 0;.  
21a80 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
21a90 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78  unc==1 ){.    Ex
21aa0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67  pr *pExpr = pAgg
21ab0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
21ac0 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61  Expr; /* Aggrega
21ad0 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  te function */. 
21ae0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
21af0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
21b00 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72  List;      /* Ar
21b10 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66  guments to agg f
21b20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  unction */..    
21b30 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
21b40 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
21b50 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  ON );.    if( pE
21b60 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
21b70 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69  nExpr==1 && pELi
21b80 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
21b90 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
21ba0 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  N ){.      const
21bb0 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70   char *zFunc = p
21bc0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
21bd0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21be0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
21bf0 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "min")==0 ){.   
21c00 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52       eRet = WHER
21c10 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
21c20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78         *ppMinMax
21c30 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20   = pEList;.     
21c40 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
21c50 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
21c60 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20   "max")==0 ){.  
21c70 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45        eRet = WHE
21c80 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
21c90 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61          *ppMinMa
21ca0 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  x = pEList;.    
21cb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
21cc0 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d   assert( *ppMinM
21cd0 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e  ax==0 || (*ppMin
21ce0 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  Max)->nExpr==1 )
21cf0 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b  ;.  return eRet;
21d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
21d10 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
21d20 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
21d30 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
21d40 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
21d50 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
21d60 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
21d70 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
21d80 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
21d90 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
21da0 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
21db0 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
21dc0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
21dd0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
21de0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
21df0 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
21e00 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
21e10 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
21e20 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
21e30 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
21e40 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
21e50 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
21e60 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
21e70 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
21e80 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
21e90 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
21ea0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
21eb0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
21ec0 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
21ed0 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
21ee0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
21ef0 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
21f00 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
21f10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
21f20 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
21f30 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
21f40 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
21f50 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
21f60 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
21f70 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
21f80 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
21f90 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
21fa0 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
21fb0 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
21fc0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
21fd0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
21fe0 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
21ff0 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
22000 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
22010 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
22020 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22030 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
22040 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
22050 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
22060 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  VER(pAggInfo->nF
22070 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  unc==0) ) return
22080 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
22090 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
220a0 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53  unc->funcFlags&S
220b0 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
220c0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
220d0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
220e0 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20  ags&EP_Distinct 
220f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
22100 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
22110 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72  *.** If the sour
22120 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73  ce-list item pas
22130 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
22140 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64  nt was augmented
22150 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45   with an.** INDE
22160 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
22170 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74  hen try to locat
22180 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
22190 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a  index. If there.
221a0 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c  ** was such a cl
221b0 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d  ause and the nam
221c0 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  ed index cannot 
221d0 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
221e0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
221f0 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  R and leave an e
22200 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20  rror in pParse. 
22210 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c  Otherwise, popul
22220 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70  ate .** pFrom->p
22230 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e  Index and return
22240 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
22250 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  nt sqlite3Indexe
22260 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20  dByLookup(Parse 
22270 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
22280 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
22290 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
222a0 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d  m->pTab && pFrom
222b0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
222c0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
222d0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
222e0 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
222f0 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d  dexedBy = pFrom-
22300 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a  >u1.zIndexedBy;.
22310 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
22320 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
22330 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20  ab->pIndex; .   
22340 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c       pIdx && sql
22350 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78  ite3StrICmp(pIdx
22360 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65  ->zName, zIndexe
22370 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dBy); .        p
22380 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
22390 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
223a0 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
223b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
223c0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
223d0 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
223e0 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20  xedBy, 0);.     
223f0 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
22400 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
22410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
22420 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
22430 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  From->pIBIndex =
22440 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
22450 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22460 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
22470 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
22480 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
22490 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
224a0 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
224b0 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
224c0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
224d0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
224e0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
224f0 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
22500 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
22510 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
22520 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
22530 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
22540 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
22550 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
22560 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
22570 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
22580 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
22590 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
225a0 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
225b0 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
225c0 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
225d0 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
225e0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
225f0 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
22600 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
22610 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
22620 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
22630 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
22640 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
22650 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
22660 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
22670 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
22680 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
22690 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
226a0 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
226b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
226c0 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
226d0 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
226e0 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
226f0 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
22700 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
22710 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
22720 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
22730 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
22740 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
22750 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
22760 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
22770 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
22780 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
22790 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
227a0 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
227b0 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
227c0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
227d0 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
227e0 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
227f0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
22800 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
22810 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
22820 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
22830 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
22840 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
22850 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
22860 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
22870 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
22880 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
22890 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
228a0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
228b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
228c0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
228d0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
228e0 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
228f0 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
22900 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
22910 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
22920 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
22930 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
22940 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
22950 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
22960 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
22970 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
22980 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
22990 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
229a0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
229b0 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
229c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
229d0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
229e0 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
229f0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
22a00 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
22a10 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
22a20 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
22a30 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
22a40 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
22a50 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
22a60 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
22a70 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
22a80 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
22a90 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
22aa0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
22ab0 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
22ac0 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
22ad0 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
22ae0 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
22af0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
22b00 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
22b10 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
22b20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
22b30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
22b40 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
22b50 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
22b60 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
22b70 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
22b80 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
22b90 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
22ba0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c  3Expr(db, TK_ALL
22bb0 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
22bc0 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
22bd0 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
22be0 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
22bf0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
22c00 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
22c10 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
22c20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
22c30 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
22c40 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20   p->pWith = 0;. 
22c50 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
22c60 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
22c70 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
22c80 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72  lags & SF_Conver
22c90 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  ted)==0 );.  p->
22ca0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
22cb0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65  onverted;.  asse
22cc0 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  rt( pNew->pPrior
22cd0 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  !=0 );.  pNew->p
22ce0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
22cf0 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  New;.  pNew->pLi
22d00 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
22d10 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
22d20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
22d30 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  nue;.}..#ifndef 
22d40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
22d50 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
22d60 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
22d70 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
22d80 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
22d90 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
22da0 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
22db0 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
22dc0 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
22dd0 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
22de0 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
22df0 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
22e00 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
22e10 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
22e20 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
22e30 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
22e40 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
22e50 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
22e60 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
22e70 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
22e80 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
22e90 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
22ea0 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
22eb0 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
22ec0 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
22ed0 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
22ee0 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
22ef0 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
22f00 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
22f10 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
22f20 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f40 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72 6d  * Current outerm
22f50 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
22f60 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
22f70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
22f80 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
22f90 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
22fa0 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
22fb0 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22fd0 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
22fe0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
22ff0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
23000 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
23010 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
23020 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
23030 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
23040 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
23050 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
23060 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
23070 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
23080 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
23090 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
230a0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
230b0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
230c0 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
230d0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
230e0 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
230f0 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
23100 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
23110 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
23120 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23130 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23140 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
23150 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
23160 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
23170 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
23180 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
23190 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
231a0 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
231b0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
231c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
231d0 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
231e0 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
231f0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
23200 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
23210 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
23220 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
23230 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
23240 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
23250 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
23260 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
23270 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
23280 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
23290 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
232a0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
232b0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
232c0 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
232d0 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
232e0 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
232f0 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
23300 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
23310 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
23320 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
23330 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
23340 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23350 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
23360 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
23370 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
23380 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
23390 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70 57  =0 || pParse->pW
233a0 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ith==0 );.  if( 
233b0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57 69  pWith ){.    pWi
233c0 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
233d0 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
233e0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
233f0 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
23400 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20 62  e->bFreeWith = b
23410 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Free;.  }.}../*.
23420 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23430 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d   checks if argum
23440 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73  ent pFrom refers
23450 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72   to a CTE declar
23460 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48  ed by .** a WITH
23470 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73   clause on the s
23480 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d  tack currently m
23490 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  aintained by the
234a0 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a   parser. And,.**
234b0 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72   if currently pr
234c0 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65  ocessing a CTE e
234d0 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74  xpression, if it
234e0 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a   is a recursive.
234f0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
23500 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e  the current CTE.
23510 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
23520 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65  falls into eithe
23530 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74  r of the two cat
23540 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70  egories above, p
23550 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e  From->pTab.** an
23560 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  d other fields a
23570 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63  re populated acc
23580 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61  ordingly. The ca
23590 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63  ller should chec
235a0 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61  k.** (pFrom->pTa
235b0 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69  b!=0) to determi
235c0 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
235d0 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d  t a successful m
235e0 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e  atch.** was foun
235f0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
23600 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20   or not a match 
23610 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45  is found, SQLITE
23620 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
23630 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f  if no error.** o
23640 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
23650 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61  or does occur, a
23660 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
23670 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
23680 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73  .** parser and s
23690 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ome error code o
236a0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
236b0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
236c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68  .static int with
236d0 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72  Expand(.  Walker
236e0 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74   *pWalker, .  st
236f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
23700 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61  m *pFrom.){.  Pa
23710 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
23720 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
23730 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23740 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72  Parse->db;.  str
23750 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20  uct Cte *pCte;  
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23770 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20  Matched CTE (or 
23780 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68  NULL if no match
23790 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  ) */.  With *pWi
237a0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
237b0 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63         /* WITH c
237c0 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20  lause that pCte 
237d0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
237e0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
237f0 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43  pTab==0 );..  pC
23800 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28  te = searchWith(
23810 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70  pParse->pWith, p
23820 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20  From, &pWith);. 
23830 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20   if( pCte ){.   
23840 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
23850 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
23860 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
23870 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74  pSel;.    Select
23880 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
23890 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
238a0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
238b0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
238c0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20   bMayRecursive; 
238d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
238e0 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a  ue if compound j
238f0 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b  oined by UNION [
23900 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68  ALL] */.    With
23910 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20   *pSavedWith;   
23920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
23930 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50  tial value of pP
23940 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a  arse->pWith */..
23950 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e      /* If pCte->
23960 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  zErr is non-NULL
23970 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
23980 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
23990 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
239a0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
239b0 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
239c0 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
239d0 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
239e0 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
239f0 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20  . If pCte->zErr 
23a00 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
23a10 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  is is not a recu
23a20 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e  rsive reference.
23a30 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
23a40 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20  case, proceed.  
23a50 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  */.    if( pCte-
23a60 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  >zErr ){.      s
23a70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
23a80 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45 72  Parse, pCte->zEr
23a90 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  r, pCte->zName);
23aa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23ab0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
23ac0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
23ad0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
23ae0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  .    pFrom->pTab
23af0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
23b00 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
23b10 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
23b20 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
23b30 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
23b40 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e  bort;.    pTab->
23b50 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  nRef = 1;.    pT
23b60 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
23b70 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
23b80 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
23b90 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
23ba0 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
23bb0 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
23bc0 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
23bd0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
23be0 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
23bf0 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
23c00 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e  Ephemeral | TF_N
23c10 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
23c20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
23c30 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
23c40 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
23c50 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
23c60 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
23c70 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
23c80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23c90 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23ca0 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f  Select );..    /
23cb0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
23cc0 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43  is a recursive C
23cd0 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20  TE. */.    pSel 
23ce0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
23cf0 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73  ;.    bMayRecurs
23d00 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70  ive = ( pSel->op
23d10 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c  ==TK_ALL || pSel
23d20 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
23d30 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
23d40 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
23d50 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
23d60 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
23d70 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
23d80 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
23d90 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
23da0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
23db0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23dc0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
23dd0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
23de0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
23df0 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
23e00 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
23e10 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
23e20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
23e30 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
23e40 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
23e50 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
23e60 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
23e70 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
23e80 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69       pItem->fg.i
23e90 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a  sRecursive = 1;.
23ea0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
23eb0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
23ec0 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
23ed0 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65   |= SF_Recursive
23ee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23ef0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23f00 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72  * Only one recur
23f10 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
23f20 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20  s permitted. */ 
23f30 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
23f40 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73  Ref>2 ){.      s
23f50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
23f60 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
23f70 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  , "multiple refe
23f80 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73  rences to recurs
23f90 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  ive table: %s", 
23fa0 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pCte->zName.    
23fb0 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
23fc0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
23fd0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23fe0 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20  ( pTab->nRef==1 
23ff0 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c  || ((pSel->selFl
24000 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65  ags&SF_Recursive
24010 29 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d  ) && pTab->nRef=
24020 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65  =2 ));..    pCte
24030 2d 3e 7a 45 72 72 20 3d 20 22 63 69 72 63 75 6c  ->zErr = "circul
24040 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73  ar reference: %s
24050 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74  ";.    pSavedWit
24060 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  h = pParse->pWit
24070 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
24080 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
24090 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
240a0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61  ect(pWalker, bMa
240b0 79 52 65 63 75 72 73 69 76 65 20 3f 20 70 53 65  yRecursive ? pSe
240c0 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c  l->pPrior : pSel
240d0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66  );..    for(pLef
240e0 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70  t=pSel; pLeft->p
240f0 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65  Prior; pLeft=pLe
24100 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20  ft->pPrior);.   
24110 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d   pEList = pLeft-
24120 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  >pEList;.    if(
24130 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a   pCte->pCols ){.
24140 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
24150 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
24160 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
24170 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
24180 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
24190 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
241a0 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
241b0 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
241c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
241d0 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
241e0 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
241f0 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
24200 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
24210 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
24220 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
24230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24240 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
24250 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
24260 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
24270 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43   }..    sqlite3C
24280 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
24290 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
242a0 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
242b0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
242c0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
242d0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ive ){.      if(
242e0 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
242f0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
24300 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
24310 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65  zErr = "multiple
24320 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
24330 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20  ences: %s";.    
24340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24350 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72   pCte->zErr = "r
24360 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
24370 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79  ce in a subquery
24380 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  : %s";.      }. 
24390 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
243a0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
243b0 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
243c0 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b   pCte->zErr = 0;
243d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
243e0 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
243f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
24400 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
24410 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
24420 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
24430 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
24440 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
24450 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61  cond argument ha
24460 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20  s an associated 
24470 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c  WITH .** clause,
24480 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65   pop it from the
24490 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73   stack stored as
244a0 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72   part of the Par
244b0 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  se object..**.**
244c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
244d0 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53  s used as the xS
244e0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29  electCallback2()
244f0 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20   callback by.** 
24500 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
24510 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69  and() when walki
24520 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65  ng a SELECT tree
24530 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c   to resolve tabl
24540 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f  e.** names and o
24550 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
24560 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73   elements. .*/.s
24570 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
24580 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20  tPopWith(Walker 
24590 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
245a0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
245b0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
245c0 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20  >pParse;.  With 
245d0 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67  *pWith = findRig
245e0 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
245f0 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d 30  ;.  if( pWith!=0
24600 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24610 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70  pParse->pWith==p
24620 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72  With );.    pPar
24630 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
24640 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d  h->pOuter;.  }.}
24650 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73  .#else.#define s
24660 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23  electPopWith 0.#
24670 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
24680 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57  s routine is a W
24690 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  alker callback f
246a0 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61  or "expanding" a
246b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
246c0 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67  t..** "Expanding
246d0 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68  " means to do th
246e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
246f0 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
24700 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
24710 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
24720 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
24730 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
24740 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
24750 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
24760 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
24770 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
24780 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
24790 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
247a0 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
247b0 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
247c0 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
247d0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
247e0 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
247f0 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
24800 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
24810 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
24820 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
24830 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
24840 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
24850 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
24860 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
24870 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
24880 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
24890 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
248a0 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
248b0 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
248c0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
248d0 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
248e0 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
248f0 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73  sing up the pers
24900 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
24910 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
24920 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
24930 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
24940 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
24950 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
24960 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  ommodate the NAT
24970 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
24980 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
24990 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
249a0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
249b0 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
249c0 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
249d0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
249e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
249f0 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
24a00 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
24a10 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
24a20 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
24a30 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
24a40 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
24a50 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
24a60 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
24a70 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
24a80 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
24a90 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
24aa0 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
24ab0 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
24ac0 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
24ad0 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  nt selectExpande
24ae0 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
24af0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
24b00 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
24b10 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
24b20 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
24b30 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
24b40 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
24b50 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
24b60 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24b70 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
24b80 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
24b90 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20  db;.  Expr *pE, 
24ba0 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b  *pRight, *pExpr;
24bb0 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20  .  u16 selFlags 
24bc0 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a  = p->selFlags;..
24bd0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
24be0 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
24bf0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
24c00 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
24c10 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
24c20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70   }.  if( NEVER(p
24c30 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73  ->pSrc==0) || (s
24c40 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
24c50 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  anded)!=0 ){.   
24c60 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
24c70 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  e;.  }.  pTabLis
24c80 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
24c90 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
24ca0 74 3b 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  t;.  if( pWalker
24cb0 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  ->xSelectCallbac
24cc0 6b 32 3d 3d 73 65 6c 65 63 74 50 6f 70 57 69 74  k2==selectPopWit
24cd0 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
24ce0 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c  WithPush(pParse,
24cf0 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
24d00 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20  )->pWith, 0);.  
24d10 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
24d20 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
24d30 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
24d40 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
24d50 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
24d60 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
24d70 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
24d80 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
24d90 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
24da0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
24db0 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  TabList);..  /* 
24dc0 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
24dd0 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
24de0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
24df0 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
24e00 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
24e10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24e20 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
24e30 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
24e40 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
24e50 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
24e60 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
24e70 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
24e80 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
24e90 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
24ea0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
24eb0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
24ec0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
24ed0 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
24ee0 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  *pTab;.    asser
24ef0 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52  t( pFrom->fg.isR
24f00 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70  ecursive==0 || p
24f10 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20 20  From->pTab );.  
24f20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
24f30 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f  isRecursive ) co
24f40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
24f50 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
24f60 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
24f70 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c  statement has al
24f80 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61  ready been prepa
24f90 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e  red.  There is n
24fa0 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20  o need.      ** 
24fb0 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a  to go further. *
24fc0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
24fd0 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  i==0 );.#ifndef 
24fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
24ff0 20 20 20 20 20 20 73 65 6c 65 63 74 50 6f 70 57        selectPopW
25000 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b  ith(pWalker, p);
25010 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
25020 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
25030 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
25040 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
25050 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64    if( withExpand
25060 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29  (pWalker, pFrom)
25070 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
25080 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72  ort;.    if( pFr
25090 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c  om->pTab ) {} el
250a0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
250b0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
250c0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
250d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
250e0 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
250f0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
25100 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
25110 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
25120 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
25130 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
25140 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
25150 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
25160 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
25170 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
25180 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
25190 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
251a0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
251b0 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f  bort;.      pFro
251c0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
251d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
251e0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
251f0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69  Table));.      i
25200 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
25210 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
25220 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20       pTab->nRef 
25230 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  = 1;.      pTab-
25240 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
25250 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
25260 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69  ite_sq_%p", (voi
25270 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
25280 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
25290 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53  ior ){ pSel = pS
252a0 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20  el->pPrior; }.  
252b0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
252c0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
252d0 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c  Parse, pSel->pEL
252e0 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ist,&pTab->nCol,
252f0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
25300 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
25310 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62  = -1;.      pTab
25320 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
25330 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
25340 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
25350 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20  048576) );.     
25360 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
25370 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
25380 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
25390 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
253a0 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
253b0 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
253c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
253d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
253e0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
253f0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
25400 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
25410 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
25420 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  em(pParse, 0, pF
25430 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rom);.      if( 
25440 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
25450 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25460 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66    if( pTab->nRef
25470 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  ==0xffff ){.    
25480 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25490 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
254a0 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73   many references
254b0 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20   to \"%s\": max 
254c0 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20  65535",.        
254d0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b     pTab->zName);
254e0 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
254f0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
25500 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
25510 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
25520 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
25530 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
25540 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
25550 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
25560 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
25570 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
25580 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  pTab->pSelect ||
25590 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
255a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
255b0 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20  e reach here if 
255c0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
255d0 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69  is a really a vi
255e0 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ew */.        if
255f0 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
25600 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
25610 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
25620 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
25640 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
25650 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
25660 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
25670 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
25680 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
25690 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
256a0 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
256b0 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pFrom->pSelect,
256c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
256d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
256e0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
256f0 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
25700 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
25710 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
25720 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
25730 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
25740 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
25750 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
25760 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
25770 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
25780 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
25790 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
257a0 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
257b0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
257c0 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
257d0 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
257e0 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
257f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
25800 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
25810 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
25820 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
25830 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
25840 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
25850 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
25860 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
25870 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
25880 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
25890 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
258a0 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
258b0 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
258c0 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
258d0 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
258e0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
258f0 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
25900 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
25910 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
25920 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
25930 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
25940 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
25950 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
25960 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
25970 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
25980 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
25990 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
259a0 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
259b0 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
259c0 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
259d0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
259e0 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
259f0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
25a00 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
25a10 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
25a20 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
25a30 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
25a40 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
25a50 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
25a60 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
25a70 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
25a80 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
25a90 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
25aa0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
25ab0 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
25ac0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
25ad0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
25ae0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
25af0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
25b00 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
25b10 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
25b20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
25b30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
25b40 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
25b50 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
25b60 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
25b70 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
25b80 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
25b90 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
25ba0 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
25bb0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
25bc0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
25bd0 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
25be0 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
25bf0 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
25c00 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
25c10 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
25c20 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
25c30 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
25c40 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
25c50 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
25c60 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
25c70 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
25c80 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
25c90 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
25ca0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
25cb0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
25cc0 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
25cd0 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
25ce0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
25cf0 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
25d10 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25d20 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
25d30 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
25d40 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
25d50 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; k++){.      p
25d60 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
25d70 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
25d80 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  E->pRight;.     
25d90 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
25da0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
25db0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
25dc0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
25dd0 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
25de0 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
25df0 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
25e00 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
25e10 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
25e20 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
25e30 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
25e40 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25e50 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
25e60 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
25e70 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
25e80 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
25e90 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
25ea0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
25eb0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
25ec0 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
25ed0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
25ee0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
25ef0 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
25f00 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
25f10 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
25f20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
25f30 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
25f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25f50 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
25f60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25f70 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
25f80 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
25f90 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
25fa0 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
25fb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
25fc0 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
25fd0 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
25fe0 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
25ff0 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
26000 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
26010 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
26020 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
26030 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
26040 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
26050 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
26060 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
26070 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
26080 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
26090 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
260a0 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
260b0 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
260c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
260d0 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
260e0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
260f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
26100 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
26110 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
26120 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
26130 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
26140 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
26150 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
26160 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
26170 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
26180 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
26190 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
261a0 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
261b0 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
261c0 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
261d0 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
261e0 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
261f0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
26200 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
26210 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
26220 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
26230 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26240 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
26250 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
26260 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
26270 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
26280 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
26290 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
262a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
262b0 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
262c0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
262d0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
262e0 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
262f0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
26300 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
26310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26320 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
26330 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
26340 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
26350 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
26360 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
26370 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
26380 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
26390 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
263a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
263b0 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
263c0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
263d0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
263e0 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
263f0 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
26400 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
26410 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
26420 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
26430 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
26440 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
26450 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
26460 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
26470 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
26480 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
26490 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
264a0 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
264b0 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
264c0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
264d0 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
264e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
264f0 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
26510 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
26520 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
26530 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
26540 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
26550 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
26570 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
26580 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
26590 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
265a0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
265b0 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c  idden' (currentl
265c0 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a  y only possible.
265d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
265e0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
265f0 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75  s), do not inclu
26600 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70  de it in the exp
26610 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  anded.          
26620 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20    ** result-set 
26630 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20  list..          
26640 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
26650 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c   if( IsHiddenCol
26660 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
26670 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
26680 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69       assert(IsVi
26690 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20  rtual(pTab));.  
266a0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
266b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
266c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
266d0 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a  tableSeen = 1;..
266e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
266f0 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30  i>0 && zTName==0
26700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26710 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67    if( (pFrom->fg
26720 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
26730 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20  ATURAL)!=0.     
26740 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61             && ta
26750 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
26760 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a  x(pTabList, i, z
26770 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20  Name, 0, 0).    
26780 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
26790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
267a0 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
267b0 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
267c0 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
267d0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
267e0 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74     ** table to t
267f0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
26800 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  join */.        
26810 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
26820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26830 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
26840 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
26850 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55  tIndex(pFrom->pU
26860 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
26870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26880 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
26890 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
268a0 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
268b0 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
268c0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
268d0 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
268e0 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
268f0 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
26900 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
26910 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
26920 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
26930 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
26940 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
26950 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
26960 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
26970 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
26980 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
26990 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
269a0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
269b0 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
269c0 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
269d0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
269e0 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
269f0 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
26a00 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
26a10 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
26a30 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
26a40 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
26a50 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
26a60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
26a70 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e      if( zSchemaN
26a80 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
26a90 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
26aa0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
26ab0 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d  K_ID, zSchemaNam
26ac0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26ad0 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
26ae0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
26af0 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
26b00 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
26b10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26b20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
26b30 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
26b40 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
26b50 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
26b60 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
26b70 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
26b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26b90 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
26ba0 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
26bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26bd0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
26be0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
26bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26c00 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
26c10 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
26c20 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
26c30 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
26c40 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43   sColname.z = zC
26c50 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
26c60 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d      sColname.n =
26c70 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
26c80 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20  (zColname);.    
26c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26ca0 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
26cb0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
26cc0 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
26cd0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
26ce0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
26cf0 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
26d00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
26d10 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
26d20 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
26d30 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
26d40 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
26d50 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
26d60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26d70 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
26d80 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
26d90 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
26da0 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
26dc0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
26dd0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
26de0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
26e00 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
26e10 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
26e20 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e50 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
26e60 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
26e70 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26e80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26e90 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
26ec0 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
26ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26ef0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
26f00 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
26f10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26f20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
26f30 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
26f40 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
26f50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26f60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26f70 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
26f80 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
26f90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
26fa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
26fb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
26fc0 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
26fd0 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
26fe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26ff0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27000 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
27010 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
27020 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
27030 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
27040 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
27050 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
27060 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
27070 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
27080 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
27090 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
270a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
270b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
270c0 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
270d0 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
270e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
270f0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
27100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
27110 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
27120 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
27130 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  er..**.** When t
27140 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
27150 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  he Walker.xExprC
27160 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70  allback then exp
27170 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a  ression trees.**
27180 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68   are walked with
27190 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20  out any actions 
271a0 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65  being taken at e
271b0 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75  ach node.  Presu
271c0 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74  mably,.** when t
271d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
271e0 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78  sed for Walker.x
271f0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
27200 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65  n .** Walker.xSe
27210 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20  lectCallback is 
27220 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  set to do someth
27230 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65  ing useful for e
27240 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72  very .** subquer
27250 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
27260 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
27270 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  int exprWalkNoop
27280 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
27290 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32  , Expr *NotUsed2
272a0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
272b0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
272c0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
272d0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
272e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
272f0 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73  routine "expands
27300 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
27310 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ment and all of 
27320 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a  its subqueries..
27330 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** For additiona
27340 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  l information on
27350 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74   what it means t
27360 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c  o "expand" a SEL
27370 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
27380 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  , see the commen
27390 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45  t on the selectE
273a0 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c  xpand worker cal
273b0 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a  lback above..**.
273c0 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53  ** Expanding a S
273d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
273e0 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65  is the first ste
273f0 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  p in processing 
27400 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
27410 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45  ement.  The SELE
27420 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73  CT statement mus
27430 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
27440 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73  fore.** name res
27450 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f  olution is perfo
27460 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rmed..**.** If a
27470 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
27480 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ng, an error mes
27490 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
274a0 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20  into pParse..** 
274b0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
274c0 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20  tion can detect 
274d0 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c  the problem by l
274e0 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65  ooking at pParse
274f0 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72  ->nErr.** and/or
27500 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
27510 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74  locFailed..*/.st
27520 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
27530 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61  3SelectExpand(Pa
27540 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
27550 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
27560 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
27570 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
27580 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
27590 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
275a0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
275b0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
275c0 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
275d0 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
275e0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
275f0 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
27600 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
27610 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
27620 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
27630 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
27640 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
27650 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
27660 3b 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63 74  ;.  if( (pSelect
27670 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27680 4d 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 29  MultiValue)==0 )
27690 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
276a0 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
276b0 74 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20  tPopWith;.  }.  
276c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
276d0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
276e0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
276f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
27700 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
27710 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
27720 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
27730 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
27740 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
27750 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
27760 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
27770 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
27780 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
27790 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
277a0 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
277b0 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
277c0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
277d0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
277e0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
277f0 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
27800 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
27810 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
27820 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
27830 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
27840 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
27850 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
27860 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
27870 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
27880 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
27890 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
278a0 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
278b0 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
278c0 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
278d0 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
278e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
278f0 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
27900 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
27910 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
27920 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
27930 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
27940 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
27950 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27960 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
27970 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
27980 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27990 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
279a0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
279b0 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
279c0 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ed );.  if( (p->
279d0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
279e0 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b  sTypeInfo)==0 ){
279f0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
27a00 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
27a10 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d  fo;.    pParse =
27a20 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
27a30 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
27a40 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f   p->pSrc;.    fo
27a50 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
27a60 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
27a70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
27a80 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
27a90 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
27aa0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
27ab0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61    if( ALWAYS(pTa
27ac0 62 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e  b!=0) && (pTab->
27ad0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
27ae0 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
27af0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d         /* A sub-
27b00 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
27b10 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
27b20 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20  LECT */.        
27b30 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
27b40 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
27b50 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20         if( pSel 
27b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
27b70 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
27b80 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
27b90 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
27ba0 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
27bb0 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
27bc0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
27bd0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  pSel);.        }
27be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27bf0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
27c00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27c10 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
27c20 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
27c30 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
27c40 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
27c50 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
27c60 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
27c70 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
27c80 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
27c90 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
27ca0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
27cb0 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
27cc0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
27cd0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
27ce0 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
27cf0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
27d00 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
27d10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27d20 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
27d30 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
27d40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
27d50 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
27d60 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
27d70 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
27d80 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
27d90 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
27da0 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
27db0 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
27dc0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
27dd0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
27de0 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
27df0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
27e00 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
27e10 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
27e20 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
27e30 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
27e40 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
27e50 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
27e60 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
27e70 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
27e80 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
27e90 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
27ea0 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
27eb0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
27ec0 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
27ed0 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
27ee0 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
27ef0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
27f00 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
27f10 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
27f20 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
27f30 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
27f40 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
27f50 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
27f60 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
27f70 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
27f80 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
27f90 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
27fa0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27fb0 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
27fc0 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
27fd0 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
27fe0 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
27ff0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
28000 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
28010 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
28020 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
28030 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
28040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28050 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
28060 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
28070 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
28080 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
28090 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
280a0 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
280b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
280c0 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
280d0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
280e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
280f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
28100 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
28110 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
28120 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
28130 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
28140 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
28150 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
28160 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
28170 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
28180 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
28190 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
281a0 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
281b0 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
281c0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
281d0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
281e0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
281f0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
28200 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
28210 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
28220 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
28230 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
28240 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
28250 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
28260 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
28270 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
28280 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
28290 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
282a0 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
282b0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
282c0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
282d0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
282e0 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
282f0 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
28300 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
28310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
28320 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
28330 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
28340 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
28350 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
28360 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
28370 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
28380 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
28390 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
283a0 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
283b0 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
283c0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
283d0 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
283e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
283f0 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
28400 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
28410 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
28420 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
28430 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
28440 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
28450 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
28460 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
28470 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
28480 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
28490 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
284a0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
284b0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
284c0 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
284d0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
284e0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
284f0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
28500 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
28510 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
28520 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
28530 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
28540 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
28550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
28560 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
28570 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
28580 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
28590 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
285a0 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
285b0 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
285c0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
285d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
285e0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
285f0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
28600 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
28610 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
28620 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
28630 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
28640 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
28650 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
28660 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
28670 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
28680 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
28690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
286a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
286b0 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
286c0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
286d0 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
286e0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
286f0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
28700 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
28710 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
28720 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
28730 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
28740 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
28750 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
28760 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
28770 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
28780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28790 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
287a0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
287b0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
287c0 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20  e, pE->x.pList, 
287d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
287e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
287f0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
28800 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
28810 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
28840 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
28850 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
28860 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
28870 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
28880 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
28890 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
288a0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
288b0 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
288c0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
288d0 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
288e0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
288f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
28900 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
28910 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
28920 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
28930 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
28940 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
28950 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
28960 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
28970 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
28980 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
28990 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
289a0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
289b0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
289c0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
289d0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
289e0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
289f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
28a00 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
28a10 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
28a20 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
28a30 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
28a60 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
28a70 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
28a80 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
28a90 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
28aa0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
28ab0 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
28ac0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
28ad0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
28ae0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
28af0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
28b00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
28b10 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
28b20 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
28b30 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
28b40 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
28b50 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
28b60 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
28b70 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
28b80 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
28b90 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
28ba0 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
28bb0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
28bc0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
28bd0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
28be0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
28bf0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
28c00 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
28c10 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
28c20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
28c30 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
28c40 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
28c50 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
28c60 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
28c70 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
28c80 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
28c90 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
28ca0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
28cb0 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
28cc0 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
28cd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
28ce0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
28cf0 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
28d00 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
28d10 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
28d20 74 2c 20 72 65 67 41 67 67 2c 20 53 51 4c 49 54  t, regAgg, SQLIT
28d30 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20  E_ECEL_DUP);.   
28d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
28d50 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
28d60 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
28d70 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
28d80 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
28d90 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
28da0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
28db0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
28dc0 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b  case( nArg==0 );
28dd0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69    /* Error condi
28de0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65  tion */.      te
28df0 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29  stcase( nArg>1 )
28e00 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65  ;   /* Also an e
28e10 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  rror */.      co
28e20 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
28e30 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  e, pF->iDistinct
28e40 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72  , addrNext, 1, r
28e50 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20  egAgg);.    }.  
28e60 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
28e70 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
28e80 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
28e90 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  L ){.      CollS
28ea0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
28eb0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
28ec0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
28ed0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
28ee0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
28ef0 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69  st!=0 );  /* pLi
28f00 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75  st!=0 if pF->pFu
28f10 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20  nc has NEEDCOLL 
28f20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  */.      for(j=0
28f30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
28f40 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41  ; !pColl && j<nA
28f50 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rg; j++, pItem++
28f60 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
28f70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
28f80 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
28f90 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
28fa0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
28fb0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
28fc0 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
28fd0 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
28fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28ff0 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70  ( regHit==0 && p
29000 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
29010 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d  lator ) regHit =
29020 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
29030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29040 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
29050 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20  ollSeq, regHit, 
29060 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
29070 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
29080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29090 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
290a0 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c   OP_AggStep0, 0,
290b0 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
290c0 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
290d0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
290e0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
290f0 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
29100 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
29110 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
29120 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
29130 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
29140 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
29150 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
29160 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
29170 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
29180 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
29190 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
291a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
291b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
291c0 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
291d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
291e0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
291f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
29200 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
29210 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
29220 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
29230 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
29240 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
29250 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
29260 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
29270 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
29280 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
29290 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
292a0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
292b0 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
292c0 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
292d0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
292e0 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
292f0 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
29300 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
29310 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
29320 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
29330 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
29340 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
29350 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
29360 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
29370 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
29380 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
29390 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
293a0 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
293b0 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
293c0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
293d0 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
293e0 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
293f0 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
29400 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
29410 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
29420 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
29430 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
29440 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
29450 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
29460 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
29470 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
29480 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
29490 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
294a0 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
294b0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
294c0 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
294d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
294e0 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
294f0 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
29500 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
29510 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
29520 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29530 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
29540 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
29550 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
29560 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
29570 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
29580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
29590 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
295a0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
295b0 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
295c0 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
295d0 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
295e0 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
295f0 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
29600 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
29610 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
29620 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
29630 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
29640 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29660 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
29670 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
29680 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
29690 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
296a0 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
296b0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
296c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296d0 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
296e0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
296f0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
29700 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
29710 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
29720 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49  int bCover = (pI
29730 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77  dx!=0 && (HasRow
29740 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50  id(pTab) || !IsP
29750 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
29760 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72  Idx)));.    char
29770 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33   *zEqp = sqlite3
29780 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
29790 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20  db, "SCAN TABLE 
297a0 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
297b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
297c0 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22        bCover ? "
297d0 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
297e0 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
297f0 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70        bCover ? p
29800 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
29810 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
29820 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
29830 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
29840 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  dbe, OP_Explain,
29850 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
29860 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20  Id, 0, 0, zEqp, 
29870 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
29880 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
29890 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69  define explainSi
298a0 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29  mpleCount(a,b,c)
298b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
298c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
298d0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
298e0 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
298f0 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
29900 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
29910 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
29920 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
29930 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
29940 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
29950 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
29960 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
29970 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
29980 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
29990 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
299a0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
299b0 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
299c0 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
299d0 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
299e0 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
299f0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
29a00 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
29a10 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
29a20 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
29a30 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
29a40 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
29a50 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
29a60 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
29a70 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
29a80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
29a90 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
29aa0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
29ab0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
29ac0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
29ad0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
29ae0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
29af0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
29b00 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
29b10 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
29b20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
29b30 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
29b40 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
29b50 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
29b60 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
29b70 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
29b80 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
29b90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
29ba0 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
29bb0 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
29bc0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
29bd0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
29be0 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
29bf0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
29c00 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
29c10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29c20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
29c30 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
29c40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
29c50 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  pEList = 0;  /* 
29c60 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
29c70 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
29c80 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
29c90 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
29ca0 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
29cb0 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
29cc0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
29cd0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
29ce0 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
29cf0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
29d00 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
29d10 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
29d20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
29d30 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
29d40 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
29d50 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
29d60 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
29d70 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
29d80 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
29d90 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
29da0 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
29db0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
29dc0 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
29dd0 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
29de0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
29df0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
29e00 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
29e10 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
29e20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
29e30 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
29e40 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
29e50 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
29e60 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
29e70 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
29e80 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
29e90 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
29ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
29eb0 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
29ec0 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
29ed0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
29ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
29ef0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
29f00 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  on */..#ifndef S
29f10 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
29f20 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72  IN.  int iRestor
29f30 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72  eSelectId = pPar
29f40 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20  se->iSelectId;. 
29f50 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
29f60 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65  Id = pParse->iNe
29f70 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65  xtSelectId++;.#e
29f80 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61  ndif..  db = pPa
29f90 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
29fa0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
29fb0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
29fc0 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
29fd0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
29fe0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
29ff0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2a000 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
2a010 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
2a020 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
2a030 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
2a040 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45  ggInfo));.#if SE
2a050 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2a060 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c  D.  pParse->nSel
2a070 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53  ectIndent++;.  S
2a080 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2a090 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70  rse,p, ("begin p
2a0a0 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b  rocessing:\n"));
2a0b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2a0c0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2a0d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2a0e0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2a0f0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2a100 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
2a110 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2a120 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2a130 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
2a140 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2a150 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2a160 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66  ->eDest!=SRT_Fif
2a170 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
2a180 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2a190 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2a1a0 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a  RT_DistQueue );.
2a1b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2a1c0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2a1d0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75  t->eDest!=SRT_Qu
2a1e0 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e  eue );.  if( Ign
2a1f0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2a200 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
2a210 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
2a220 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
2a230 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a240 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
2a250 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2a260 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
2a270 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2a280 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20  SRT_Discard ||. 
2a290 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2a2a0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75  >eDest==SRT_Queu
2a2b0 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  e  || pDest->eDe
2a2c0 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
2a2d0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
2a2e0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a2f0 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44  _DistQueue || pD
2a300 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a310 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66  Fifo);.    /* If
2a320 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20   ORDER BY makes 
2a330 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e  no difference in
2a340 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e   the output then
2a350 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20   neither does.  
2a360 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f    ** DISTINCT so
2a370 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76   it can be remov
2a380 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73  ed too. */.    s
2a390 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2a3a0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
2a3b0 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  erBy);.    p->pO
2a3c0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2a3d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
2a3e0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
2a3f0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2a400 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
2a410 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  0);.  memset(&sS
2a420 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ort, 0, sizeof(s
2a430 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e  Sort));.  sSort.
2a440 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
2a450 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69  rderBy;.  pTabLi
2a460 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2a470 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2a480 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
2a490 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
2a4a0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
2a4b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
2a4c0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41  List!=0 );.  isA
2a4d0 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
2a4e0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2a4f0 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54  )!=0;.#if SELECT
2a500 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2a510 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2a520 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2a530 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2a540 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
2a550 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72  , ("after name r
2a560 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b  esolution:\n"));
2a570 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2a580 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2a590 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2a5a0 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
2a5b0 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
2a5c0 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
2a5d0 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
2a5e0 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
2a5f0 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69   output..  */.#i
2a600 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a610 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
2a620 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
2a630 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
2a640 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
2a650 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
2a660 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
2a670 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
2a680 64 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f  dif..  /* Try to
2a690 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
2a6a0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2a6b0 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74  clause up into t
2a6c0 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20  he main query.  
2a6d0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2a6e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2a6f0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
2a700 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2a710 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
2a720 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
2a730 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2a740 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2a750 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2a760 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2a770 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
2a780 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2a790 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
2a7a0 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20  t isAggSub;.    
2a7b0 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f  if( pSub==0 ) co
2a7c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 41 67  ntinue;.    isAg
2a7d0 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65  gSub = (pSub->se
2a7e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2a7f0 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69  egate)!=0;.    i
2a800 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
2a810 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
2a820 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62   isAgg, isAggSub
2a830 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
2a840 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
2a850 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
2a860 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
2a870 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
2a880 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
2a890 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
2a8a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2a8b0 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
2a8c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
2a8d0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  -1;.    }.    pT
2a8e0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2a8f0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
2a900 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2a910 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2a920 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
2a930 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
2a940 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  {.      sSort.pO
2a950 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2a960 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erBy;.    }.  }.
2a970 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74  #endif..  /* Get
2a980 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20 56   a pointer the V
2a990 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
2a9a0 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69  uction, allocati
2a9b0 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69 66  ng a new VDBE if
2a9c0 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e   one.  ** does n
2a9d0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
2a9e0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
2a9f0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
2aa00 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
2aa10 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2aa20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2aa30 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
2aa40 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65  LECT.  /* Handle
2aa50 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
2aa60 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e   statements usin
2aa70 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  g the separate m
2aa80 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a  ultiSelect().  *
2aa90 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a  * procedure..  *
2aaa0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
2aab0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
2aac0 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
2aad0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
2aae0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2aaf0 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
2ab00 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
2ab10 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c  lectId);.#if SEL
2ab20 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2ab30 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2ab40 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
2ab50 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  d compound-selec
2ab60 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  t processing\n")
2ab70 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
2ab80 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
2ab90 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2aba0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2abb0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
2abc0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
2abd0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
2abe0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
2abf0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2ac00 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2ac10 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
2ac20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
2ac30 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ).  for(i=0; i<p
2ac40 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2ac50 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2ac60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2ac70 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2ac80 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
2ac90 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
2aca0 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2acb0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2acc0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
2acd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
2ace0 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65  /* Sometimes the
2acf0 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71   code for a subq
2ad00 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e  uery will be gen
2ad10 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  erated more than
2ad20 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66  .    ** once, if
2ad30 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
2ad40 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45   part of the WHE
2ad50 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c  RE clause in a L
2ad60 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a  EFT JOIN,.    **
2ad70 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49   for example.  I
2ad80 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20  n that case, do 
2ad90 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74  not regenerate t
2ada0 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66  he code to manif
2adb0 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65  est.    ** a vie
2adc0 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74  w or the co-rout
2add0 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ine to implement
2ade0 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69   a view.  The fi
2adf0 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20  rst instance.   
2ae00 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e   ** is sufficien
2ae10 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75  t, though the su
2ae20 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69  broutine to mani
2ae30 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f  fest the view do
2ae40 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  es need.    ** t
2ae50 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61  o be invoked aga
2ae60 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  in. */.    if( p
2ae70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2ae80 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  b ){.      if( p
2ae90 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2aea0 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  utine==0 ){.    
2aeb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2aec0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2aed0 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  b, pItem->regRet
2aee0 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72  urn, pItem->addr
2aef0 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20  FillSub);.      
2af00 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  }.      continue
2af10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2af20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
2af30 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
2af40 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
2af50 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
2af60 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
2af70 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c  rred to by this,
2af80 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65   the parent sele
2af90 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65  ct. The child se
2afa0 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20  lect.    ** may 
2afb0 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69  contain expressi
2afc0 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d  on trees of at m
2afd0 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49  ost.    ** (SQLI
2afe0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2aff0 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29  H-Parse.nHeight)
2b000 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73   height. This is
2b010 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f   a bit.    ** mo
2b020 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20  re conservative 
2b030 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20  than necessary, 
2b040 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20  but much easier 
2b050 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20  than enforcing. 
2b060 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c     ** an exact l
2b070 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  imit..    */.   
2b080 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
2b090 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   += sqlite3Selec
2b0a0 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
2b0b0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70  .    /* Make cop
2b0c0 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20  ies of constant 
2b0d0 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72  WHERE-clause ter
2b0e0 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ms in the outer 
2b0f0 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a  query down.    *
2b100 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75 62  * inside the sub
2b110 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e  query.  This can
2b120 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75 65   help the subque
2b130 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65  ry to run more e
2b140 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20  fficiently..    
2b150 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74 65  */.    if( (pIte
2b160 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
2b170 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20   JT_OUTER)==0.  
2b180 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68     && pushDownWh
2b190 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53 75  ereTerms(db, pSu
2b1a0 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  b, p->pWhere, pI
2b1b0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20  tem->iCursor).  
2b1c0 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54    ){.#if SELECTT
2b1d0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2b1e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
2b1f0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2b200 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c  0 ){.        SEL
2b210 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
2b220 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
2b230 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73  WHERE-clause pus
2b240 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20  h-down:\n"));.  
2b250 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2b260 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2b270 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
2b280 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2b290 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2b2a0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2b2b0 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a  e subquery.    *
2b2c0 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  /.    if( pTabLi
2b2d0 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
2b2e0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
2b2f0 20 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 0a 20 20   & SF_All)==0.  
2b300 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2b310 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2b320 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
2b330 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ne).    ){.     
2b340 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
2b350 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
2b360 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
2b370 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2b380 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2b390 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
2b3a0 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
2b3b0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2b3c0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2b3d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
2b3e0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2b3f0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2b400 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2b410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b420 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
2b430 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2b440 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
2b450 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
2b460 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2b470 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2b480 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
2b490 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2b4a0 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
2b4b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2b4c0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2b4d0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
2b4e0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2b4f0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2b500 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2b510 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2b520 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2b530 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2b540 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2b550 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2b560 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2b570 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2b580 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
2b590 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2b5a0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2b5b0 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2b5c0 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  = 1;.      pItem
2b5d0 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65  ->regResult = de
2b5e0 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20  st.iSdst;.      
2b5f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b600 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
2b610 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2b620 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73  Return);.      s
2b630 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2b640 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29  re(v, addrTop-1)
2b650 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
2b660 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2b670 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65  (pParse);.    }e
2b680 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  lse{.      /* Ge
2b690 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2b6a0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ine that will fi
2b6b0 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ll an ephemeral 
2b6c0 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20  table with.     
2b6d0 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   ** the content 
2b6e0 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72 79  of this subquery
2b6f0 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  .  pItem->addrFi
2b700 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74  llSub will point
2b710 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
2b720 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2b730 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75  generated subrou
2b740 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65  tine.  pItem->re
2b750 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a  gReturn.      **
2b760 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 61   is a register a
2b770 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
2b780 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
2b790 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20  return address. 
2b7a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
2b7b0 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20  t topAddr;.     
2b7c0 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20   int onceAddr = 
2b7d0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74  0;.      int ret
2b7e0 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Addr;.      asse
2b7f0 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
2b800 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20  illSub==0 );.   
2b810 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
2b820 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
2b830 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41  nMem;.      topA
2b840 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2b850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2b860 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d  teger, 0, pItem-
2b870 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2b880 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
2b890 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b  llSub = topAddr+
2b8a0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  1;.      if( pIt
2b8b0 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61  em->fg.isCorrela
2b8c0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
2b8d0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
2b8e0 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72  uery is not corr
2b8f0 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65  elated and if we
2b900 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20   are not inside 
2b910 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  of.        ** a 
2b920 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
2b930 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
2b940 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
2b950 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
2b960 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e          ** once.
2b970 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   */.        once
2b980 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
2b990 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
2b9a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2b9b0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2b9c0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
2b9d0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
2b9e0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2b9f0 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
2ba00 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
2ba10 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
2ba20 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
2ba30 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
2ba40 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2ba50 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  }.      sqlite3S
2ba60 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
2ba70 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61  est, SRT_EphemTa
2ba80 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  b, pItem->iCurso
2ba90 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  r);.      explai
2baa0 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
2bab0 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75  m->iSelectId, (u
2bac0 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  8)pParse->iNextS
2bad0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
2bae0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
2baf0 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
2bb00 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
2bb10 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
2bb20 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
2bb30 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  t(pSub->nSelectR
2bb40 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  ow);.      if( o
2bb50 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  nceAddr ) sqlite
2bb60 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2bb70 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20   onceAddr);.    
2bb80 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69    retAddr = sqli
2bb90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2bba0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65   OP_Return, pIte
2bbb0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2bbc0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2bbd0 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70  ((v, "end %s", p
2bbe0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2bbf0 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
2bc00 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
2bc10 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64  , topAddr, retAd
2bc20 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
2bc30 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
2bc40 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
2bc50 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
2bc60 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2bc70 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2bc80 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
2bc90 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
2bca0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
2bcb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2bcc0 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65  /* Various eleme
2bcd0 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  nts of the SELEC
2bce0 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f  T copied into lo
2bcf0 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f  cal variables fo
2bd00 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  r.  ** convenien
2bd10 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  ce */.  pEList =
2bd20 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57   p->pEList;.  pW
2bd30 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
2bd40 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
2bd50 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
2bd60 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
2bd70 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e  ng;.  sDistinct.
2bd80 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c  isTnct = (p->sel
2bd90 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2bda0 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45  nct)!=0;..#if SE
2bdb0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2bdc0 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
2bdd0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34  electTrace & 0x4
2bde0 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
2bdf0 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
2be00 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c  se,p,("After all
2be10 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61   FROM-clause ana
2be20 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20  lysis:\n"));.   
2be30 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2be40 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2be50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2be60 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
2be70 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20  s DISTINCT with 
2be80 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20  an ORDER BY but 
2be90 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
2bea0 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69  ate, and .  ** i
2beb0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  f the select-lis
2bec0 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
2bed0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69   the ORDER BY li
2bee0 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75  st, then this qu
2bef0 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ery.  ** can be 
2bf00 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47  rewritten as a G
2bf10 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65  ROUP BY. In othe
2bf20 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20  r words, this:. 
2bf30 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
2bf40 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a  ECT DISTINCT xyz
2bf50 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20   FROM ... ORDER 
2bf60 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
2bf70 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
2bf80 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
2bf90 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f    SELECT xyz FRO
2bfa0 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78  M ... GROUP BY x
2bfb0 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  yz ORDER BY xyz.
2bfc0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
2bfd0 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65  cond form is pre
2bfe0 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67  ferred as a sing
2bff0 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d  le index (or tem
2c000 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20  p-table) may be 
2c010 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62  .  ** used for b
2c020 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  oth the ORDER BY
2c030 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72   and DISTINCT pr
2c040 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69  ocessing. As ori
2c050 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72  ginally .  ** wr
2c060 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20  itten the query 
2c070 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d  must use a temp-
2c080 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61  table for at lea
2c090 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52  st one of the OR
2c0a0 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64  DER .  ** BY and
2c0b0 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61   DISTINCT, and a
2c0c0 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72  n index or separ
2c0d0 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  ate temp-table f
2c0e0 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20  or the other..  
2c0f0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
2c100 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
2c110 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
2c120 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
2c130 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45   .   && sqlite3E
2c140 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73  xprListCompare(s
2c150 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70  Sort.pOrderBy, p
2c160 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20  EList, -1)==0.  
2c170 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
2c180 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
2c190 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  ct;.    pGroupBy
2c1a0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d   = p->pGroupBy =
2c1b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2c1c0 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20  Dup(db, pEList, 
2c1d0 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63  0);.    /* Notic
2c1e0 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
2c1f0 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20  ght SF_Distinct 
2c200 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
2c210 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67   from p->selFlag
2c220 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44  s,.    ** the sD
2c230 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69  istinct.isTnct i
2c240 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65  s still set.  He
2c250 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72  nce, isTnct repr
2c260 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a  esents the.    *
2c270 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69  * original setti
2c280 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73  ng of the SF_Dis
2c290 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20  tinct flag, not 
2c2a0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
2c2b0 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ing */.    asser
2c2c0 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  t( sDistinct.isT
2c2d0 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nct );.  }..  /*
2c2e0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
2c2f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2c300 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20   then create an 
2c310 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
2c320 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73  to.  ** do the s
2c330 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69  orting.  But thi
2c340 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65  s sorting epheme
2c350 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20  ral index might 
2c360 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e  end up.  ** bein
2c370 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
2c380 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72  data can be extr
2c390 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
2c3a0 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20  ted order..  ** 
2c3b0 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
2c3c0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50  ase, then the OP
2c3d0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
2c3e0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
2c3f0 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20  be.  ** changed 
2c400 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
2c410 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ce we figure out
2c420 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
2c430 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20  g index is.  ** 
2c440 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
2c450 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2c460 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73  ndex variable is
2c470 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
2c480 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68  ate.  ** that ch
2c490 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
2c4a0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2c4b0 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
2c4c0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
2c4d0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
2c4e0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2c4f0 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  rse, sSort.pOrde
2c500 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  rBy, 0, pEList->
2c510 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72  nExpr);.    sSor
2c520 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  t.iECursor = pPa
2c530 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2c540 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2c550 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
2c560 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2c570 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2c580 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53  al,.          sS
2c590 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53  ort.iECursor, sS
2c5a0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
2c5b0 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45  xpr+1+pEList->nE
2c5c0 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  xpr, 0,.        
2c5d0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2c5e0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20  o, P4_KEYINFO.  
2c5f0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2c600 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
2c610 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
2c620 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
2c630 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
2c640 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
2c650 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
2c660 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
2c670 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
2c680 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
2c690 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2c6a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
2c6b0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
2c6c0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
2c6d0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
2c6e0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
2c6f0 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
2c700 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
2c710 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2c720 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2c730 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  = LARGEST_INT64;
2c740 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
2c750 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
2c760 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28   p, iEnd);.  if(
2c770 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26   p->iLimit==0 &&
2c780 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2c790 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73  ndex>=0 ){.    s
2c7a0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
2c7b0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
2c7c0 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20  tIndex)->opcode 
2c7d0 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b  = OP_SorterOpen;
2c7e0 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46  .    sSort.sortF
2c7f0 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47  lags |= SORTFLAG
2c800 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a  _UseSorter;.  }.
2c810 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70  .  /* Open an ep
2c820 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f  hemeral index to
2c830 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
2c840 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
2c850 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2c860 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
2c870 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  ){.    sDistinct
2c880 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73  .tabTnct = pPars
2c890 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
2c8a0 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63  Distinct.addrTnc
2c8b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
2c8c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2c8d0 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8f0 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e 63          sDistinc
2c900 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c  t.tabTnct, 0, 0,
2c910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2c930 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d  har*)keyInfoFrom
2c940 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2c950 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c   p->pEList,0,0),
2c960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
2c980 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
2c990 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c9a0 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
2c9b0 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73  DERED);.    sDis
2c9c0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2c9d0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2c9e0 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65  _UNORDERED;.  }e
2c9f0 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  lse{.    sDistin
2ca00 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2ca10 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
2ca20 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OP;.  }..  if( !
2ca30 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42  isAgg && pGroupB
2ca40 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  y==0 ){.    /* N
2ca50 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
2ca60 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f  tions and no GRO
2ca70 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
2ca80 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61      u16 wctrlFla
2ca90 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e  gs = (sDistinct.
2caa0 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57  isTnct ? WHERE_W
2cab0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30  ANT_DISTINCT : 0
2cac0 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  );..    /* Begin
2cad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2cae0 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66  an. */.    pWInf
2caf0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2cb00 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2cb10 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2cb20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a  sSort.pOrderBy,.
2cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cb50 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46  ->pEList, wctrlF
2cb60 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66  lags, 0);.    if
2cb70 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
2cb80 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2cb90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2cba0 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e  ereOutputRowCoun
2cbb0 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e  t(pWInfo) < p->n
2cbc0 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20  SelectRow ){.   
2cbd0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
2cbe0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
2cbf0 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
2cc00 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Info);.    }.   
2cc10 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69   if( sDistinct.i
2cc20 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33  sTnct && sqlite3
2cc30 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
2cc40 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20  pWInfo) ){.     
2cc50 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2cc60 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68  Type = sqlite3Wh
2cc70 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
2cc80 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Info);.    }.   
2cc90 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
2cca0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f  rBy ){.      sSo
2ccb0 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69  rt.nOBSat = sqli
2ccc0 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
2ccd0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2cce0 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
2ccf0 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
2cd00 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
2cd10 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
2cd20 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
2cd30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2cd40 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
2cd50 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
2cd60 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
2cd70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
2cd80 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
2cd90 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
2cda0 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
2cdb0 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
2cdc0 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
2cdd0 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
2cde0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
2cdf0 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
2ce00 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
2ce10 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
2ce20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2ce30 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
2ce40 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
2ce50 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
2ce60 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
2ce70 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
2ce80 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63  op. */.    selec
2ce90 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
2cea0 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31  e, p, pEList, -1
2ceb0 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74  , &sSort, &sDist
2cec0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
2ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cee0 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
2cef0 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66  tinueLabel(pWInf
2cf00 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
2cf10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2cf20 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
2cf30 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a  WInfo));..    /*
2cf40 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
2cf50 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
2cf60 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
2cf70 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2cf80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2cf90 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20   This case when 
2cfa0 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72  there exist aggr
2cfb0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2cfc0 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
2cfd0 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62  ause.    ** or b
2cfe0 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  oth */.    NameC
2cff0 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
2d000 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
2d010 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
2d020 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
2d030 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
2d040 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
2d050 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
2d060 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
2d070 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2d080 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
2d090 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2d0a0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2d0b0 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
2d0c0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
2d0d0 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
2d0e0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
2d0f0 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
2d100 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
2d110 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
2d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2d130 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
2d140 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
2d150 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
2d160 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
2d170 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
2d180 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
2d190 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
2d1a0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
2d1b0 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
2d1c0 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
2d1d0 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
2d1e0 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
2d1f0 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
2d200 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
2d210 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20  UP BY order */. 
2d220 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
2d230 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
2d240 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
2d250 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
2d260 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20     int sortPTab 
2d270 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f  = 0;   /* Pseudo
2d280 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65  table used to de
2d290 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73  code sorting res
2d2a0 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ults */.    int 
2d2b0 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20  sortOut = 0;    
2d2c0 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74  /* Output regist
2d2d0 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  er from the sort
2d2e0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72  er */.    int or
2d2f0 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a  derByGrp = 0; /*
2d300 20 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f   True if the GRO
2d310 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20  UP BY and ORDER 
2d320 42 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  BY are the same 
2d330 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  */..    /* Remov
2d340 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c  e any and all al
2d350 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68  iases between th
2d360 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
2d370 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55   the.    ** GROU
2d380 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  P BY clause..   
2d390 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
2d3a0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
2d3b0 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
2d3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2d3d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2d3e0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2d3f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2d400 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
2d410 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f  g over expressio
2d420 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a  n in a list */..
2d430 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70        for(k=p->p
2d440 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  EList->nExpr, pI
2d450 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  tem=p->pEList->a
2d460 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
2d470 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
2d480 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
2d490 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2d4a0 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42     for(k=pGroupB
2d4b0 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  y->nExpr, pItem=
2d4c0 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30  pGroupBy->a; k>0
2d4d0 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
2d4e0 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
2d4f0 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
2d500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2d510 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
2d520 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  100 ) p->nSelect
2d530 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d  Row = 100;.    }
2d540 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
2d550 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20  SelectRow = 1;. 
2d560 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2d570 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20  there is both a 
2d580 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20  GROUP BY and an 
2d590 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2d5a0 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20  and they are.   
2d5b0 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74   ** identical, t
2d5c0 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f  hen it may be po
2d5d0 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c  ssible to disabl
2d5e0 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
2d5f0 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e  lause .    ** on
2d600 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61   the grounds tha
2d610 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77  t the GROUP BY w
2d620 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e  ill cause elemen
2d630 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a  ts to come out .
2d640 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f      ** in the co
2d650 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20  rrect order. It 
2d660 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74  also may not - t
2d670 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68  he GROUP BY migh
2d680 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64  t use a.    ** d
2d690 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68  atabase index th
2d6a0 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74  at causes rows t
2d6b0 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67  o be grouped tog
2d6c0 65 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65  ether as require
2d6d0 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74  d.    ** but not
2d6e0 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64   actually sorted
2d6f0 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65  . Either way, re
2d700 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
2d710 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52  at the.    ** OR
2d720 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50  DER BY and GROUP
2d730 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20   BY clauses are 
2d740 74 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74  the same by sett
2d750 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47  ing the orderByG
2d760 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  rp.    ** variab
2d770 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2d780 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2d790 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c  ompare(pGroupBy,
2d7a0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
2d7b0 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2d7c0 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b   orderByGrp = 1;
2d7d0 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
2d7e0 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74  Create a label t
2d7f0 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77  o jump to when w
2d800 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20  e want to abort 
2d810 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  the query */.   
2d820 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74   addrEnd = sqlit
2d830 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2d840 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  v);..    /* Conv
2d850 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ert TK_COLUMN no
2d860 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  des into TK_AGG_
2d870 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20  COLUMN and make 
2d880 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a  entries in.    *
2d890 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61  * sAggInfo for a
2d8a0 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ll TK_AGG_FUNCTI
2d8b0 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72  ON nodes in expr
2d8c0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  essions of the. 
2d8d0 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
2d8e0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  tement..    */. 
2d8f0 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
2d900 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
2d910 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
2d920 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
2d930 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
2d940 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70  bList;.    sNC.p
2d950 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49  AggInfo = &sAggI
2d960 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  nfo;.    sAggInf
2d970 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65  o.mnReg = pParse
2d980 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41  ->nMem+1;.    sA
2d990 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
2d9a0 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
2d9b0 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
2d9c0 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  pr : 0;.    sAgg
2d9d0 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
2d9e0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71  pGroupBy;.    sq
2d9f0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2da00 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45  AggList(&sNC, pE
2da10 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
2da20 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2da30 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74  List(&sNC, sSort
2da40 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
2da50 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
2da60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2da70 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2da80 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
2da90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
2daa0 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
2dab0 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
2dac0 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
2dad0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
2dae0 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
2daf0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2db00 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e  sProperty(sAggIn
2db10 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
2db20 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2db30 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63   );.      sNC.nc
2db40 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67  Flags |= NC_InAg
2db50 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  gFunc;.      sql
2db60 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2db70 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
2db80 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
2db90 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
2dba0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2dbb0 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75  s &= ~NC_InAggFu
2dbc0 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  nc;.    }.    sA
2dbd0 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70  ggInfo.mxReg = p
2dbe0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2dbf0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2dc00 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2dc10 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
2dc20 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
2dc30 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
2dc40 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
2dc50 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
2dc60 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
2dc70 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
2dc80 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
2dc90 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
2dca0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
2dcb0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
2dcc0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
2dcd0 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
2dce0 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
2dcf0 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
2dd00 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20  /.      int j1; 
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2dd20 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f  -vs-B comparisio
2dd30 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20  n jump */.      
2dd40 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
2dd50 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  w;  /* Start of 
2dd60 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2dd70 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
2dd80 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e   row */.      in
2dd90 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20  t regOutputRow; 
2dda0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
2ddb0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
2ddc0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
2ddd0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
2dde0 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
2ddf0 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
2de00 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
2de10 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2de20 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a  drTopOfLoop;  /*
2de30 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
2de40 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  t loop */.      
2de50 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
2de60 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70  dx; /* The OP_Op
2de70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
2de80 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2de90 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  x */.      int a
2dea0 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  ddrReset;      /
2deb0 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  * Subroutine for
2dec0 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61   resetting the a
2ded0 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20  ccumulator */.  
2dee0 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
2def0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
2df00 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
2df10 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
2df20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
2df30 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2df40 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
2df50 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
2df60 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
2df70 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
2df80 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
2df90 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
2dfa0 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
2dfb0 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
2dfc0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
2dfd0 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
2dfe0 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f  ter all, the OP_
2dff0 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72  SorterOpen instr
2e000 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
2e010 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
2e020 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
2e030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e040 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2e050 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
2e060 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
2e070 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
2e080 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2e090 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  e, pGroupBy, 0, 
2e0a0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2e0b0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
2e0c0 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
2e0d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2e0e0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
2e0f0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
2e100 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
2e110 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
2e120 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
2e130 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
2e140 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2e150 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
2e160 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
2e170 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
2e180 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
2e190 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
2e1a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
2e1b0 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
2e1c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
2e1d0 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
2e1e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e1f0 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
2e200 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e210 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
2e220 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
2e230 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2e240 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
2e250 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e260 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
2e270 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2e280 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2e290 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
2e2a0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
2e2b0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2e2c0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2e2d0 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
2e2e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
2e2f0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
2e300 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
2e310 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2e320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e330 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2e340 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
2e350 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2e360 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
2e370 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2e380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e390 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2e3a0 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
2e3b0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2e3c0 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
2e3d0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
2e3e0 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
2e3f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2e400 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
2e410 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f  AMem, iAMem+pGro
2e420 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
2e430 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
2e440 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
2e450 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
2e460 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
2e470 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
2e480 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
2e490 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
2e4a0 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
2e4b0 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
2e4c0 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
2e4d0 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
2e4e0 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
2e4f0 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
2e500 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
2e510 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
2e520 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
2e530 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
2e540 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2e550 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e560 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2e570 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
2e580 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
2e590 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
2e5a0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
2e5b0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
2e5c0 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20   pGroupBy, 0,.  
2e5d0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52          WHERE_GR
2e5e0 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79  OUPBY | (orderBy
2e5f0 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54  Grp ? WHERE_SORT
2e600 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a  BYGROUP : 0), 0.
2e610 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
2e620 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
2e630 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2e640 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2e650 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
2e660 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42  pWInfo)==pGroupB
2e670 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
2e680 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
2e690 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
2e6a0 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
2e6b0 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
2e6c0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
2e6d0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
2e6e0 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
2e6f0 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
2e700 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
2e710 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
2e720 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
2e730 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
2e740 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
2e750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e760 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
2e770 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e780 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
2e790 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
2e7a0 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
2e7b0 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
2e7c0 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
2e7d0 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
2e7e0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
2e7f0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
2e800 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
2e810 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
2e820 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
2e830 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
2e840 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
2e850 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
2e860 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
2e870 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2e880 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
2e890 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
2e8a0 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
2e8b0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
2e8c0 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
2e8d0 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
2e8e0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20  able(pParse, .  
2e8f0 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74            (sDist
2e900 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28  inct.isTnct && (
2e910 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44  p->selFlags&SF_D
2e920 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20  istinct)==0) ?. 
2e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e940 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20     "DISTINCT" : 
2e950 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20  "GROUP BY");..  
2e960 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
2e970 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  t = 1;.        n
2e980 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
2e990 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
2e9a0 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70     nCol = nGroup
2e9b0 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  By;.        j = 
2e9c0 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2e9d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2e9e0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
2e9f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2ea00 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
2ea10 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
2ea20 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
2ea30 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
2ea40 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
2ea50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ea60 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
2ea70 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
2ea80 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2ea90 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
2eaa0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2eab0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2eac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2ead0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2eae0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
2eaf0 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
2eb00 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
2eb10 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
2eb20 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
2eb30 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2eb40 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2eb50 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2eb60 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
2eb70 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
2eb80 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
2eb90 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
2eba0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
2ebb0 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
2ebc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2ebd0 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   r2;..          
2ebe0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
2ebf0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
2ec00 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
2ec30 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
2ec40 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  n, pCol->iTable,
2ec50 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
2ec60 20 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20       if( r1!=r2 
2ec70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ec80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ec90 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
2eca0 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  r2, r1);.       
2ecb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ecc0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
2ecd0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ece0 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20        regRecord 
2ecf0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2ed00 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
2ed10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ed20 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
2ed30 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
2ed40 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72  , nCol, regRecor
2ed50 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2ed60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ed70 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
2ed80 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2ed90 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64  ngIdx, regRecord
2eda0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2edb0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2edc0 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
2edd0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
2ede0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2edf0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
2ee00 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  Base, nCol);.   
2ee10 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2ee20 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2ee30 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2ee40 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20  ortingIdxPTab = 
2ee50 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73  sortPTab = pPars
2ee60 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
2ee70 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c     sortOut = sql
2ee80 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2ee90 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
2eea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2eeb0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
2eec0 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f  do, sortPTab, so
2eed0 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rtOut, nCol);.  
2eee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2eef0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
2ef00 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e  rterSort, sAggIn
2ef10 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
2ef20 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
2ef30 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2ef40 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22   "GROUP BY sort"
2ef50 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  )); VdbeCoverage
2ef60 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  (v);.        sAg
2ef70 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
2ef80 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Idx = 1;.       
2ef90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2efa0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2efb0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2efc0 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
2efd0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  or temporary tab
2efe0 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47  le used by the G
2eff0 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20  ROUP BY sort.   
2f000 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72     ** will natur
2f010 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77  ally deliver row
2f020 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72  s in the order r
2f030 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f  equired by the O
2f040 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a  RDER BY.      **
2f050 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20   clause, cancel 
2f060 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
2f070 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65  ble open coded e
2f080 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a  arlier..      **
2f090 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
2f0a0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2f0b0 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20  n - the correct 
2f0c0 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65  answer should re
2f0d0 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e  sult regardless.
2f0e0 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68  .      ** Use th
2f0f0 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  e SQLITE_GroupBy
2f100 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20  Order flag with 
2f110 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2f120 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20  OPTIMIZER to .  
2f130 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
2f140 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
2f150 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
2f160 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20  poses.  */.     
2f170 20 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20   if( orderByGrp 
2f180 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2f190 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2f1a0 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20  E_GroupByOrder) 
2f1b0 0a 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75  .       && (grou
2f1c0 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74  pBySort || sqlit
2f1d0 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28  e3WhereIsSorted(
2f1e0 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29  pWInfo)).      )
2f1f0 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e  {.        sSort.
2f200 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2f210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f220 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2f230 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2f240 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ndex);.      }..
2f250 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
2f260 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
2f270 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64  OUP BY terms and
2f280 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31   store in b0, b1
2f290 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  , b2....      **
2f2a0 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c   (b0 is memory l
2f2b0 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c  ocation iBMem+0,
2f2c0 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20   b1 is iBMem+1, 
2f2d0 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20  and so forth).  
2f2e0 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70      ** Then comp
2f2f0 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
2f300 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
2f310 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50  gainst the GROUP
2f320 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20   BY terms.      
2f330 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  ** from the prev
2f340 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74  ious row current
2f350 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c  ly stored in a0,
2f360 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20   a1, a2....     
2f370 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f   */.      addrTo
2f380 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  pOfLoop = sqlite
2f390 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2f3a0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2f3b0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2f3c0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2f3d0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
2f3e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2f3f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2f400 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73  OP_SorterData, s
2f410 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2f420 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f                so
2f440 72 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29  rtOut, sortPTab)
2f450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f460 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
2f470 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
2f480 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
2f490 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
2f4a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2f4b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
2f4c0 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c  olumn, sortPTab,
2f4d0 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20   j, iBMem+j);.  
2f4e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f4f0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2f500 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
2f510 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2f520 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2f530 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
2f540 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29  .pExpr, iBMem+j)
2f550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f560 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2f570 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2f580 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d  P_Compare, iAMem
2f590 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iBMem, pGroupB
2f5a0 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  y->nExpr,.      
2f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5c0 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
2f5d0 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
2f5e0 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
2f5f0 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
2f600 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2f610 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2f620 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f630 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
2f640 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56  1+1, 0, j1+1); V
2f650 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2f660 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2f670 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
2f680 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
2f690 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
2f6a0 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
2f6b0 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
2f6c0 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
2f6d0 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
2f6e0 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
2f6f0 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
2f700 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
2f710 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
2f720 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
2f730 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
2f740 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
2f750 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
2f760 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
2f770 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
2f780 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
2f790 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
2f7a0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
2f7b0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
2f7c0 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
2f7d0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
2f7e0 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
2f7f0 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
2f800 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
2f810 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
2f820 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2f830 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
2f840 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
2f850 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
2f860 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
2f870 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f880 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2f890 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
2f8a0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2f8b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2f8c0 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
2f8d0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2f8e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f8f0 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
2f900 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20  Flag, addrEnd); 
2f910 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2f920 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2f930 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
2f940 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2f950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f960 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2f970 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
2f980 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
2f990 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
2f9a0 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
2f9b0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
2f9c0 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
2f9d0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
2f9e0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
2f9f0 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
2fa00 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
2fa10 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
2fa20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2fa30 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
2fa40 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
2fa50 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2fa60 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
2fa70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2fa80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2fa90 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
2faa0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2fab0 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61  (v, "indicate da
2fac0 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
2fad0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2fae0 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
2faf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2fb00 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2fb10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fb20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2fb30 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41  P_SorterNext, sA
2fb40 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2fb50 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  x, addrTopOfLoop
2fb60 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2fb70 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2fb80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fb90 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2fba0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2fbb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2fbc0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
2fbd0 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20  rSortingIdx);.  
2fbe0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2fbf0 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
2fc00 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
2fc10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2fc20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fc30 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2fc40 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
2fc50 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2fc60 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2fc70 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72   "output final r
2fc80 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ow"));..      /*
2fc90 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73   Jump over the s
2fca0 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20  ubroutines.     
2fcb0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2fcc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2fcd0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
2fce0 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nd);..      /* G
2fcf0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
2fd00 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
2fd10 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
2fd20 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
2fd30 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
2fd40 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
2fd50 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
2fd60 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
2fd70 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
2fd80 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
2fd90 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
2fda0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
2fdb0 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
2fdc0 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
2fdd0 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
2fde0 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
2fdf0 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
2fe00 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
2fe10 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
2fe20 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
2fe30 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
2fe40 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
2fe50 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
2fe60 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
2fe70 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
2fe80 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
2fe90 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
2fea0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2feb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fec0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2fed0 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72  nteger, 1, iAbor
2fee0 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
2fef0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
2ff00 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
2ff10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2ff20 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2ff30 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
2ff40 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c  tRow);.      sql
2ff50 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2ff60 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70  abel(v, addrOutp
2ff70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64  utRow);.      ad
2ff80 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
2ff90 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2ffa0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2ffb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ffc0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55  (v, OP_IfPos, iU
2ffd0 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
2ffe0 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20  utRow+2);.      
2fff0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
30000 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
30010 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20  nt((v, "Groupby 
30020 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
30030 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b   entry point"));
30040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30050 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
30060 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
30070 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  Row);.      fina
30080 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
30090 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
300a0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
300b0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
300c0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
300d0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
300e0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
300f0 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
30100 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
30110 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
30120 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20  -1, &sSort,.    
30130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30140 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44    &sDistinct, pD
30150 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
30160 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
30170 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
30180 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
30190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
301a0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
301b0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
301c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
301d0 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
301e0 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
301f0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
30200 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
30210 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
30220 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
30230 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
30240 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30250 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
30260 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
30270 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
30280 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
30290 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
302a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
302b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
302c0 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
302d0 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
302e0 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
302f0 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61  .  Begin aggrega
30300 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f  te queries witho
30310 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a  ut GROUP BY: */.
30320 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
30330 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20   ExprList *pDel 
30340 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
30350 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
30360 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20  UNT.      Table 
30370 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  *pTab;.      if(
30380 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c   (pTab = isSimpl
30390 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49  eCount(p, &sAggI
303a0 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  nfo))!=0 ){.    
303b0 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70      /* If isSimp
303c0 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e  leCount() return
303d0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
303e0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
303f0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
30400 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
30410 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ent is of the fo
30420 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  rm:.        **. 
30430 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
30440 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
30450 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a   <tbl>.        *
30460 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
30470 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  re the Table str
30480 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
30490 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65  represents table
304a0 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20   <tbl>..        
304b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
304c0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
304d0 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69  so common that i
304e0 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73  t is optimized s
304f0 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20  pecially. The.  
30500 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e        ** OP_Coun
30510 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
30520 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72   executed either
30530 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74   on the intkey t
30540 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20  able that.      
30550 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
30560 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  e data for table
30570 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65   <tbl> or on one
30580 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e   of its indexes.
30590 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   It.        ** i
305a0 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63  s better to exec
305b0 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e  ute the op on an
305c0 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78   index, as index
305d0 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20  es are almost.  
305e0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
305f0 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65  spread across le
30600 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68  ss pages than th
30610 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  eir correspondin
30620 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  g tables..      
30630 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
30640 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  st int iDb = sql
30650 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
30660 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
30670 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
30680 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
30690 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iCsr = pParse->n
306a0 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75  Tab++;     /* Cu
306b0 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74  rsor to scan b-t
306c0 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  ree */.        I
306d0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
306e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306f0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
30700 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
30710 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
30720 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
30730 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69           /* Keyi
30740 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20  nfo for scanned 
30750 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
30760 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20   Index *pBest = 
30770 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
30780 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e        /* Best in
30790 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72  dex found so far
307a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
307b0 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e  iRoot = pTab->tn
307c0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
307d0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
307e0 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20   scanned b-tree 
307f0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  */..        sqli
30800 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
30810 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
30820 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30830 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
30840 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
30850 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
30860 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  me);..        /*
30870 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
30880 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74  index that has t
30890 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63  he lowest scan c
308a0 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ost..        **.
308b0 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31          ** (2011
308c0 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64  -04-15) Do not d
308d0 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66  o a full scan of
308e0 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e   an unordered in
308f0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  dex..        **.
30900 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33          ** (2013
30910 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63  -10-03) Do not c
30920 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73  ount the entries
30930 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e   in a partial in
30940 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  dex..        **.
30950 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72          ** In pr
30960 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e  actice the KeyIn
30970 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  fo structure wil
30980 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49  l not be used. I
30990 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20  t is only .     
309a0 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20     ** passed to 
309b0 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64  keep OP_OpenRead
309c0 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20   happy..        
309d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
309e0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
309f0 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33   pBest = sqlite3
30a00 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
30a10 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66  pTab);.        f
30a20 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
30a30 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
30a40 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
30a50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
30a60 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  x->bUnordered==0
30a70 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
30a80 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  Idx->szIdxRow<pT
30a90 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20  ab->szTabRow.   
30aa0 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
30ab0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d  >pPartIdxWhere==
30ac0 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
30ad0 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d  (!pBest || pIdx-
30ae0 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d  >szIdxRow<pBest-
30af0 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20  >szIdxRow).     
30b00 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30b10 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
30b20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30b40 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20  if( pBest ){.   
30b50 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70         iRoot = p
30b60 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  Best->tnum;.    
30b70 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
30b80 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
30b90 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
30ba0 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Best);.        }
30bb0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ..        /* Ope
30bc0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
30bd0 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68  rsor, execute th
30be0 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73  e OP_Count, clos
30bf0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f  e the cursor. */
30c00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30c10 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
30c20 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43   OP_OpenRead, iC
30c30 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20  sr, iRoot, iDb, 
30c40 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
30c50 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
30c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30c70 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
30c80 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66   (char *)pKeyInf
30c90 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
30ca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30cc0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
30cd0 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e   iCsr, sAggInfo.
30ce0 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a  aFunc[0].iMem);.
30cf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30d00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30d10 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20  Close, iCsr);.  
30d20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d        explainSim
30d30 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c  pleCount(pParse,
30d40 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20   pTab, pBest);. 
30d50 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
30d60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
30d70 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20  _BTREECOUNT */. 
30d80 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
30d90 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71  * Check if the q
30da0 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f  uery is of one o
30db0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
30dc0 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a  forms:.        *
30dd0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
30de0 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f  ELECT min(x) FRO
30df0 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
30e00 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29     SELECT max(x)
30e10 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
30e20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
30e30 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61  If it is, then a
30e40 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77  sk the code in w
30e50 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70  here.c to attemp
30e60 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74  t to sort result
30e70 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20  s.        ** as 
30e80 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  if there was an 
30e90 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20  "ORDER ON x" or 
30ea0 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43  "ORDER ON x DESC
30eb0 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20  " clause. .     
30ec0 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63     ** If where.c
30ed0 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64   is able to prod
30ee0 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74  uce results sort
30ef0 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72  ed in this order
30f00 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
30f10 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20  * add vdbe code 
30f20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
30f30 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  the processing l
30f40 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20  oop after the . 
30f50 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
30f60 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65  iteration (since
30f70 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
30f80 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
30f90 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
30fa0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70  guaranteed to op
30fb0 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77  erate on the row
30fc0 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75   with the minimu
30fd0 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20  m or maximum .  
30fe0 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
30ff0 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f  f x, the only ro
31000 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20  w required)..   
31010 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31020 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61  ** A special fla
31030 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  g must be passed
31040 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
31050 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68  Begin() to sligh
31060 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  tly.        ** m
31070 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20 61  odify behavior a
31080 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20  s follows:.     
31090 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
310a0 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72     + If the quer
310b0 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d  y is a "SELECT m
310c0 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65  in(x)", then the
310d0 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20   loop coded by. 
310e0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68         **     wh
310f0 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74  ere.c should not
31100 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e   iterate over an
31110 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20  y values with a 
31120 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20  NULL value.     
31130 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e     **     for x.
31140 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31150 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f      **   + The o
31160 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e  ptimizer code in
31170 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68   where.c (the th
31180 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73  ing that decides
31190 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
311a0 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69  *     index or i
311b0 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73  ndices to use) s
311c0 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69  hould place a di
311d0 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79  fferent priority
311e0 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   on .        ** 
311f0 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74      satisfying t
31200 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c  he 'ORDER BY' cl
31210 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65  ause than it doe
31220 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73  s in other cases
31230 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  ..        **    
31240 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61   Refer to code a
31250 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77  nd comments in w
31260 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69  here.c for detai
31270 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ls..        */. 
31280 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
31290 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20  *pMinMax = 0;.  
312a0 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20        u8 flag = 
312b0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
312c0 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20  RMAL;.        . 
312d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
312e0 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
312f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31300 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20   flag==0 );.    
31310 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69      if( p->pHavi
31320 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ng==0 ){.       
31330 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78     flag = minMax
31340 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c  Query(&sAggInfo,
31350 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20   &pMinMax);.    
31360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
31370 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c  sert( flag==0 ||
31380 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20   (pMinMax!=0 && 
31390 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d  pMinMax->nExpr==
313a0 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  1) );..        i
313b0 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  f( flag ){.     
313c0 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73       pMinMax = s
313d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
313e0 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30  p(db, pMinMax, 0
313f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65  );.          pDe
31400 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20  l = pMinMax;.   
31410 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d         if( pMinM
31420 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ax && !db->mallo
31430 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
31440 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
31450 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
31460 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44   flag!=WHERE_ORD
31470 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20  ERBY_MIN ?1:0;. 
31480 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
31490 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
314a0 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
314b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
314c0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
314d0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
314e0 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
314f0 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
31500 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
31510 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
31520 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
31530 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
31540 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
31550 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20  gle row.        
31560 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
31570 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31580 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
31590 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
315a0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57  nfo);.        pW
315b0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
315c0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
315d0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
315e0 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61  e, pMinMax,0,fla
315f0 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  g,0);.        if
31600 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  ( pWInfo==0 ){. 
31610 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31620 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
31630 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  b, pDel);.      
31640 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
31650 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
31660 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63         updateAcc
31670 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
31680 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
31690 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 69       assert( pMi
316a0 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d  nMax==0 || pMinM
316b0 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  ax->nExpr==1 );.
316c0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
316d0 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
316e0 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20  d(pWInfo)>0 ){. 
316f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31700 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
31710 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65  _Goto, 0, sqlite
31720 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
31730 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  (pWInfo));.     
31740 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
31750 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e  ((v, "%s() by in
31760 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  dex",.          
31770 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45        (flag==WHE
31780 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22  RE_ORDERBY_MIN?"
31790 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20  min":"max")));. 
317a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
317b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
317c0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
317d0 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
317e0 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
317f0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
31800 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   }..      sSort.
31810 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
31820 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
31830 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
31840 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c  Having, addrEnd,
31850 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
31860 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
31870 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
31880 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
31890 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20   -1, 0, 0, .    
318a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318b0 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64    pDest, addrEnd
318c0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
318d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
318e0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
318f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
31900 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
31910 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29  abel(v, addrEnd)
31920 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e  ;.    .  } /* en
31930 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75  dif aggregate qu
31940 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44  ery */..  if( sD
31950 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
31960 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
31970 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20  T_UNORDERED ){. 
31980 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
31990 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49 53  ble(pParse, "DIS
319a0 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20  TINCT");.  }..  
319b0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
319c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
319d0 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
319e0 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
319f0 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
31a00 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
31a10 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
31a20 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53  e..  */.  if( sS
31a30 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
31a40 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
31a50 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20 20  able(pParse,.   
31a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a70 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30    sSort.nOBSat>0
31a80 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f   ? "RIGHT PART O
31a90 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44  F ORDER BY":"ORD
31aa0 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e  ER BY");.    gen
31ab0 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
31ac0 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c  arse, p, &sSort,
31ad0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
31ae0 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
31af0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
31b00 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
31b10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
31b20 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
31b30 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
31b40 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
31b50 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65 72  n coded. If ther
31b60 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  e is an error in
31b70 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63   the Parse struc
31b80 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74  ture,.  ** set t
31b90 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
31ba0 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 30  o 1. Otherwise 0
31bb0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50 61  . */.  rc = (pPa
31bc0 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20  rse->nErr>0);.. 
31bd0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
31be0 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
31bf0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
31c00 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
31c10 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
31c20 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
31c30 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
31c40 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70  elect_end:.  exp
31c50 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
31c60 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
31c70 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
31c80 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  Id);..  /* Ident
31c90 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
31ca0 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74   if results of t
31cb0 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f  he SELECT are to
31cc0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
31cd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
31ce0 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65  E_OK && pDest->e
31cf0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
31d00 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
31d10 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
31d20 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
31d30 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
31d40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
31d50 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
31d60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
31d70 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  db, sAggInfo.aFu
31d80 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  nc);.#if SELECTT
31d90 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53  RACE_ENABLED.  S
31da0 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
31db0 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63  rse,p,("end proc
31dc0 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70  essing\n"));.  p
31dd0 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
31de0 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20  dent--;.#endif. 
31df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.