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

Artifact 2c4bfdf7c797df9b43121ed7850bf939b6f27405:


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 72 65 67 4f 72 69 67 44 61  .  int regOrigDa
41d0: 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  ta,       /* Fir
41e0: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
41f0: 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65 20  ing data before 
4200: 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  packing */.  int
4210: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
4220: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4230: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
4240: 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20   data array */. 
4250: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
4260: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4270: 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72  f reg prior to r
4280: 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65  egData available
4290: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20   for use */.){. 
42a0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
42b0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20    /* Stmt under 
42e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
42f0: 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70    int bSeq = ((p
4300: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
4310: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
4320: 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74  rter)==0);.  int
4330: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
4340: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4360: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
4370: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
4380: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
4390: 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20  bSeq + nData;   
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
43b0: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in sorter
43c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
43d0: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4400: 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72   Regs for sorter
4410: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
4420: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70   regRecord = ++p
4430: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4450: 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65   Assembled sorte
4460: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4470: 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74  t nOBSat = pSort
4480: 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  ->nOBSat;       
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
44a0: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
44b0: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e   to skip */.  in
44c0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64   /* Opcode to ad
44f0: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
4500: 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  to sorter */..  
4510: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
4520: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
4530: 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 31  assert( nData==1
4540: 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65 67   || regData==reg
4550: 4f 72 69 67 44 61 74 61 20 29 3b 0a 20 20 69 66  OrigData );.  if
4560: 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a  ( nPrefixReg ){.
4570: 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65      assert( nPre
4580: 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53  fixReg==nExpr+bS
4590: 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73  eq );.    regBas
45a0: 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45  e = regData - nE
45b0: 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65  xpr - bSeq;.  }e
45c0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65  lse{.    regBase
45d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
45e0: 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  + 1;.    pParse-
45f0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a  >nMem += nBase;.
4600: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
4610: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
4620: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4630: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20  derBy, regBase, 
4640: 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20  regOrigData,.   
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
4670: 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43  EL_DUP|SQLITE_EC
4680: 45 4c 5f 52 45 46 29 3b 0a 20 20 69 66 28 20 62  EL_REF);.  if( b
4690: 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Seq ){.    sqlit
46a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
46b0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f  OP_Sequence, pSo
46c0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
46d0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
46e0: 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  }.  if( nPrefixR
46f0: 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  eg==0 ){.    sql
4700: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
4710: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
4720: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
4730: 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20  bSeq, nData);.  
4740: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  }..  sqlite3Vdbe
4750: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
4760: 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
4770: 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e  +nOBSat, nBase-n
4780: 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64  OBSat, regRecord
4790: 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e  );.  if( nOBSat>
47a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  0 ){.    int reg
47b0: 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68  PrevKey;   /* Th
47c0: 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63  e first nOBSat c
47d0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72  olumns of the pr
47e0: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
47f0: 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b    int addrFirst;
4800: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4810: 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f  f the OP_IfNot o
4820: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74  pcode */.    int
4830: 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f   addrJmp;      /
4840: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
4850: 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20   OP_Jump opcode 
4860: 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  */.    VdbeOp *p
4870: 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f  Op;      /* Opco
4880: 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68  de that opens th
4890: 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
48a0: 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20  int nKey;       
48b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
48c0: 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d  orting key colum
48d0: 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50  ns, including OP
48e0: 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20  _Sequence */.   
48f0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20   KeyInfo *pKI;  
4900: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b     /* Original K
4910: 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f  eyInfo on the so
4920: 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  rter table */.. 
4930: 20 20 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20     regPrevKey = 
4940: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
4950: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
4960: 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61   += pSort->nOBSa
4970: 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45  t;.    nKey = nE
4980: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42  xpr - pSort->nOB
4990: 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20  Sat + bSeq;.    
49a0: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
49b0: 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71    addrFirst = sq
49c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
49d0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
49e0: 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20  Base+nExpr); .  
49f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
4a00: 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
4a10: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4a20: 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c  OP_SequenceTest,
4a30: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4a40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62  );.    }.    Vdb
4a50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4a70: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
4a80: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72  e, regPrevKey, r
4a90: 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e  egBase, pSort->n
4aa0: 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20  OBSat);.    pOp 
4ab0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
4ac0: 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64  Op(v, pSort->add
4ad0: 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
4ae0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
4af0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
4b00: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d  return;.    pOp-
4b10: 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61  >p2 = nKey + nDa
4b20: 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f  ta;.    pKI = pO
4b30: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
4b40: 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e      memset(pKI->
4b50: 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70  aSortOrder, 0, p
4b60: 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a 20  KI->nField); /* 
4b70: 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62 65  Makes OP_Jump be
4b80: 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a  low testable */.
4b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4ba0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
4bb0: 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45  char*)pKI, P4_KE
4bc0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73 74  YINFO);.    test
4bd0: 63 61 73 65 28 20 70 4b 49 2d 3e 6e 58 46 69 65  case( pKI->nXFie
4be0: 6c 64 3e 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d  ld>2 );.    pOp-
4bf0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  >p4.pKeyInfo = k
4c00: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
4c10: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4c20: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53  ->pOrderBy, nOBS
4c30: 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  at,.            
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
4c60: 4b 49 2d 3e 6e 58 46 69 65 6c 64 2d 31 29 3b 0a  KI->nXField-1);.
4c70: 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71      addrJmp = sq
4c80: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
4c90: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
4ca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4cb0: 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a  , OP_Jump, addrJ
4cc0: 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70  mp+1, 0, addrJmp
4cd0: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
4ce0: 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  e(v);.    pSort-
4cf0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71  >labelBkOut = sq
4d00: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
4d10: 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  el(v);.    pSort
4d20: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
4d30: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
4d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d50: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
4d60: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4d70: 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  n, pSort->labelB
4d80: 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  kOut);.    sqlit
4d90: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4da0: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
4db0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
4dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4dd0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
4de0: 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c  rFirst);.    sql
4df0: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
4e00: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
4e10: 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53  , regPrevKey, pS
4e20: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4e40: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70  pHere(v, addrJmp
4e50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
4e60: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
4e70: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
4e80: 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  er ){.    op = O
4e90: 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a  P_SorterInsert;.
4ea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
4eb0: 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
4ec0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
4ed0: 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70  eAddOp2(v, op, p
4ee0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20  Sort->iECursor, 
4ef0: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
4f00: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  ( pSelect->iLimi
4f10: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  t ){.    int add
4f20: 72 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  r;.    int iLimi
4f30: 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  t;.    if( pSele
4f40: 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20  ct->iOffset ){. 
4f50: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
4f60: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31  elect->iOffset+1
4f70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4f80: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
4f90: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ect->iLimit;.   
4fa0: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71   }.    addr = sq
4fb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4fc0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c  v, OP_IfNotZero,
4fd0: 20 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b 20   iLimit, 0, 1); 
4fe0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5000: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
5010: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
5020: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
5030: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5040: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
5050: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
5060: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5070: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d  re(v, addr);.  }
5080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
5090: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
50a0: 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74  the OFFSET.*/.st
50b0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66  atic void codeOf
50c0: 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  fset(.  Vdbe *v,
50d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
50e0: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
50f0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
5100: 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f   iOffset,      /
5110: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
5120: 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f  ng the offset co
5130: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5140: 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20  Continue     /* 
5150: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
5160: 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  p the current re
5170: 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  cord */.){.  if(
5180: 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20   iOffset>0 ){.  
5190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
51a0: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
51b0: 20 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69   iOffset, iConti
51c0: 6e 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76  nue, 1); VdbeCov
51d0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
51e0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
51f0: 46 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a  FFSET"));.  }.}.
5200: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5210: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
5220: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
5230: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
5240: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
5250: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
5260: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
5270: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
5280: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
5290: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
52a0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
52b0: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
52c0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
52d0: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
52e0: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
52f0: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
5300: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
5310: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
5320: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
5330: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
5340: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
5350: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
5360: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
5370: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
5380: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
5390: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
53a0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
53b0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
53c0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
53d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
53e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
53f0: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
5400: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
5410: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
5420: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
5430: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
5440: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
5450: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
5460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5470: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
5480: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
5490: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
54a0: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
54b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
54c0: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
54d0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
54e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
54f0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
5500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5510: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
5520: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
5530: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62  t, iMem, N); Vdb
5540: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5560: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5570: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
5580: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5590: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
55a0: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29  nsert, iTab, r1)
55b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
55c0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
55d0: 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  , r1);.}..#ifnde
55e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
55f0: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
5600: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
5610: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
5620: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
5630: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
5640: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
5650: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
5660: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
5670: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
5680: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
5690: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
56a0: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
56b0: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
56c0: 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f   error used to o
56d0: 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69  ccur.** in multi
56e0: 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68  ple places.  (Th
56f0: 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63  e error only occ
5700: 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65  urs in one place
5710: 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20   now, but we.** 
5720: 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f  retain the subro
5730: 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a  utine to minimiz
5740: 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f  e code disruptio
5750: 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  n.).*/.static in
5760: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
5770: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
5780: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5790: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
57a0: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
57b0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
57c0: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
57d0: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
57e0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
57f0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
5800: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
5810: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
5820: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
5830: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
5840: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
5850: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
5860: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
5870: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
5880: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
5890: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
58a0: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
58b0: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
58c0: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
58d0: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
58e0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
58f0: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
5900: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5910: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5920: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
5930: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5940: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
5950: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
5960: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
5970: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
5980: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
5990: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
59a0: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
59b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
59c0: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
59d0: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
59e0: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
59f0: 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20  row.  If srcTab 
5a00: 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  is.** zero or mo
5a10: 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73  re, then data is
5a20: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
5a30: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
5a40: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
5a50: 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f  to get number co
5a60: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61  lumns and the da
5a70: 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20  tatype for each 
5a80: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
5a90: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
5aa0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
5ab0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5ac0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5ad0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
5ae0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
5af0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5b00: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
5b10: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
5b20: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
5b30: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
5b40: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
5b50: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
5b60: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
5b70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5b80: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
5b90: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
5ba0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
5bb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
5bc0: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
5bd0: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f  how to process O
5be0: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73  RDER BY */.  Dis
5bf0: 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69  tinctCtx *pDisti
5c00: 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  nct, /* If not N
5c10: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
5c20: 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54   to process DIST
5c30: 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74  INCT */.  Select
5c40: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
5c50: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
5c60: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
5c70: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
5c80: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
5c90: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
5ca0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
5cb0: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
5cc0: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
5cd0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5ce0: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
5cf0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5d00: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5d10: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5d20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5d30: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
5d40: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5d50: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
5d60: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
5d70: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
5d80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5d90: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
5da0: 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  ry holding resul
5db0: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65  t set */.  int e
5dc0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
5dd0: 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f  est;   /* How to
5de0: 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75   dispose of resu
5df0: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
5e00: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
5e10: 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72  arm; /* First ar
5e20: 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73  gument to dispos
5e30: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
5e40: 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20  nt nResultCol;  
5e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5e60: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
5e70: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
5e80: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20  nPrefixReg = 0; 
5e90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5ea0: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
5eb0: 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52  ters before regR
5ec0: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esult */..  asse
5ed0: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
5ee0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
5ef0: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
5f00: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
5f10: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
5f20: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
5f30: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
5f40: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
5f50: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
5f60: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
5f70: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
5f80: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
5f90: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
5fa0: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
5fb0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
5fc0: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
5fd0: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
5fe0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
5ff0: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
6000: 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ultCol = pEList-
6010: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
6020: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
6030: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
6040: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
6050: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
6060: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
6070: 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d      if( !(pSort-
6080: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
6090: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
60a0: 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b   ) nPrefixReg++;
60b0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
60c0: 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65  Mem += nPrefixRe
60d0: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65  g;.    }.    pDe
60e0: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
60f0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6100: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6110: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
6120: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
6130: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
6140: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
6150: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
6160: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
6170: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
6180: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
6190: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
61a0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
61b0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
61c0: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
61d0: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
61e0: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
61f0: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
6200: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
6210: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
6220: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
6230: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
6240: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
6250: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
6260: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
6270: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
6280: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
6290: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
62a0: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
62b0: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
62c0: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
62d0: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
62e0: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
62f0: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
6300: 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74  Col;.  regResult
6310: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
6320: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
6330: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6340: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6350: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6360: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6370: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
6380: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
6390: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
63a0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
63b0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
63c0: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
63d0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
63e0: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
63f0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6400: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
6410: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
6420: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
6430: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
6440: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
6450: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
6460: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
6470: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a    u8 ecelFlags;.
6480: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
6490: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
64a0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
64b0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
64c0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65  ine ){.      ece
64d0: 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  lFlags = SQLITE_
64e0: 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65  ECEL_DUP;.    }e
64f0: 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46  lse{.      ecelF
6500: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lags = 0;.    }.
6510: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6520: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
6530: 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52  se, pEList, regR
6540: 65 73 75 6c 74 2c 20 30 2c 20 65 63 65 6c 46 6c  esult, 0, ecelFl
6550: 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
6560: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
6570: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
6580: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
6590: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
65a0: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
65b0: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
65c0: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
65d0: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
65e0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
65f0: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
6600: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
6610: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69  .    switch( pDi
6620: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
6630: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
6640: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
6650: 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
6660: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
6670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
6680: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20  longer required 
6690: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
66a0: 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  str. */.        
66b0: 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20  int iJump;      
66c0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
66d0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
66e0: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72         int regPr
66f0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
6700: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63  * Previous row c
6710: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  ontent */..     
6720: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
6730: 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65  pace for the pre
6740: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
6750: 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70       regPrev = p
6760: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
6770: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
6780: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6790: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l;..        /* C
67a0: 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
67b0: 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64  nEphemeral coded
67c0: 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f   earlier to an O
67d0: 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a  P_Null.        *
67e0: 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43  * sets the MEM_C
67f0: 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68  leared bit on th
6800: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
6810: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
6820: 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ** previous valu
6830: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
6840: 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65  use the OP_Ne be
6850: 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20  low to always.  
6860: 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e        ** fail on
6870: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
6880: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
6890: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72   even if the fir
68a0: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  st.        ** ro
68b0: 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a  w is all NULLs..
68c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
68d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
68e0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
68f0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
6900: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20  t);.        pOp 
6910: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
6920: 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  Op(v, pDistinct-
6930: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
6940: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
6950: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
6960: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
6970: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
6980: 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20  = regPrev;..    
6990: 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69      iJump = sqli
69a0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
69b0: 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43  dr(v) + nResultC
69c0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ol;.        for(
69d0: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
69e0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
69f0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
6a00: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
6a10: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
6a20: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6a30: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
6a40: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
6a50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6a60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a70: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
6a80: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
6a90: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
6aa0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
6ab0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
6ac0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6ae0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
6af0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
6b00: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
6b10: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
6b20: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
6b30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
6b40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6b50: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
6b60: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
6b70: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
6b80: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
6b90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6ba0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
6bb0: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
6bc0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
6bd0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
6be0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
6bf0: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
6c00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6c10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6c20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6c30: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
6c40: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
6c50: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
6c60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6c70: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
6c80: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
6c90: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
6ca0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6cb0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
6cc0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
6cd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6ce0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
6cf0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
6d00: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
6d10: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
6d20: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
6d30: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
6d40: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
6d50: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
6d60: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
6d70: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
6d80: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
6d90: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
6da0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
6db0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
6dc0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
6dd0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
6de0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
6df0: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
6e00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
6e10: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
6e20: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
6e30: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
6e40: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
6e50: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
6e60: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
6e70: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
6e80: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
6e90: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6ea0: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
6eb0: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
6ec0: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
6ed0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
6ee0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6ef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6f00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6f10: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
6f20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
6f30: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
6f40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6f50: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
6f60: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
6f70: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6f80: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6f90: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
6fa0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6fb0: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
6fc0: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
6fd0: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
6fe0: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
6ff0: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
7000: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
7010: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
7020: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
7030: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
7040: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
7050: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7060: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
7070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7080: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  Op3(v, OP_IdxDel
7090: 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ete, iParm, regR
70a0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
70b0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
70c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
70d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
70e0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
70f0: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
7100: 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
7110: 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
7120: 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
7130: 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20  case SRT_Fifo:. 
7140: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
7150: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
7160: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
7170: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
7180: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
7190: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
71a0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50  Range(pParse, nP
71b0: 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20  refixReg+1);.   
71c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
71d0: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
71e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
71f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
7200: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74 65  mTab );.      te
7210: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7220: 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20 20  RT_Fifo );.     
7230: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7240: 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  ==SRT_DistFifo )
7250: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7260: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7270: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
7280: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7290: 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  l, r1+nPrefixReg
72a0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
72b0: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20  E_OMIT_CTE.     
72c0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
72d0: 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20  DistFifo ){.    
72e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
72f0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
7300: 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73  tFifo, then curs
7310: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
7320: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
7330: 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  on an ephemeral 
7340: 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75  index. If the cu
7350: 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72  rrent row is alr
7360: 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20  eady present.   
7370: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
7380: 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69  ndex, do not wri
7390: 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74  te it to the out
73a0: 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64  put. If not, add
73b0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
73c0: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74  current row to t
73d0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f  he index and pro
73e0: 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e  ceed with writin
73f0: 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20  g it to the.    
7400: 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61      ** output ta
7410: 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f  ble as well.  */
7420: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
7430: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
7440: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
7450: 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  4;.        sqlit
7460: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
7470: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
7480: 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20  rm+1, addr, r1, 
7490: 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
74a0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
74b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
74c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
74d0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c  Insert, iParm+1,
74e0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73   r1);.        as
74f0: 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29  sert( pSort==0 )
7500: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
7510: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7520: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7530: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7540: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b  e, pSort, p, r1+
7550: 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67 52 65  nPrefixReg,regRe
7560: 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52 65  sult,1,nPrefixRe
7570: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7580: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
7590: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
75a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
75b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
75c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
75d0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
75e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
75f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7600: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
7610: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
7620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7630: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7640: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
7650: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7660: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
7670: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
7680: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7690: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
76a0: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
76b0: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
76c0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
76d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
76e0: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
76f0: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
7700: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
7710: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
7720: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
7730: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
7740: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
7750: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
7760: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
7770: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
7780: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
7790: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
77a0: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
77b0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
77c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
77d0: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
77e0: 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
77f0: 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  st =.           
7800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
7810: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
7820: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7830: 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
7840: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7850: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
7860: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
7870: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
7880: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
7890: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
78a0: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
78b0: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
78c0: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
78d0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
78e0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
78f0: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
7900: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
7910: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
7920: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
7930: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
7940: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
7950: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
7960: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7970: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7980: 52 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c  Result, regResul
7990: 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67  t, 1, nPrefixReg
79a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
79b0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
79c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
79d0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
79e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
79f0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
7a00: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
7a10: 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e  t,1,r1, &pDest->
7a20: 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  affSdst, 1);.   
7a30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7a40: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
7a50: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
7a60: 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20  esult, 1);.     
7a70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7a80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
7a90: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
7aa0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7ab0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
7ac0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
7ad0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7ae0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7af0: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
7b00: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
7b10: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
7b20: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
7b30: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
7b40: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
7b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7b70: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
7b80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
7b90: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
7ba0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
7bb0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
7bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
7bd0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
7be0: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
7bf0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
7c00: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
7c10: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
7c20: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
7c30: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
7c40: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
7c50: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
7c60: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
7c70: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
7c80: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
7c90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
7ca0: 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20  esultCol==1 );. 
7cb0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
7cc0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
7cd0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
7ce0: 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65   pSort, p, regRe
7cf0: 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  sult, regResult,
7d00: 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b   1, nPrefixReg);
7d10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7d20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
7d30: 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29  gResult==iParm )
7d40: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
7d50: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
7d60: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
7d70: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
7d80: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
7d90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
7da0: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
7db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7dc0: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  ERY */..    case
7dd0: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
7de0: 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61        /* Send da
7df0: 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69  ta to a co-routi
7e00: 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ne */.    case S
7e10: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20  RT_Output: {    
7e20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
7e30: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
7e40: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7e50: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
7e60: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
7e70: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7e80: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
7e90: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7ea0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7eb0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7ec0: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
7ed0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
7ee0: 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ultCol,.        
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
7f00: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
7f10: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
7f20: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
7f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7f40: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
7f50: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
7f60: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
7f70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7f80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7f90: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
7fa0: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  ow, regResult, n
7fb0: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
7fc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7fd0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7fe0: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
7ff0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8000: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
8020: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8030: 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72  IT_CTE.    /* Wr
8040: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
8050: 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20  into a priority 
8060: 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72  queue that is or
8070: 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  der according to
8080: 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70  .    ** pDest->p
8090: 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29  OrderBy (in pSO)
80a0: 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  .  pDest->iSDPar
80b0: 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20  m (in iParm) is 
80c0: 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61  the cursor for a
80d0: 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77  n.    ** index w
80e0: 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32  ith pSO->nExpr+2
80f0: 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64   columns.  Build
8100: 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f   a key using pSO
8110: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20   for the first. 
8120: 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72     ** pSO->nExpr
8130: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d   columns, then m
8140: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79  ake sure all key
8150: 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20  s are unique by 
8160: 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20  adding a.    ** 
8170: 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63  final OP_Sequenc
8180: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c  e column.  The l
8190: 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  ast column is th
81a0: 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c  e record as a bl
81b0: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ob..    */.    c
81c0: 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75  ase SRT_DistQueu
81d0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
81e0: 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69  Queue: {.      i
81f0: 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69  nt nKey;.      i
8200: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20  nt r1, r2, r3;. 
8210: 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73       int addrTes
8220: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70  t = 0;.      Exp
8230: 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20  rList *pSO;.    
8240: 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70    pSO = pDest->p
8250: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61  OrderBy;.      a
8260: 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20  ssert( pSO );.  
8270: 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e      nKey = pSO->
8280: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20  nExpr;.      r1 
8290: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
82a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
82b0: 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
82c0: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
82d0: 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  se, nKey+2);.   
82e0: 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b     r3 = r2+nKey+
82f0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  1;.      if( eDe
8300: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
8310: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
8320: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
8330: 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c  on is DistQueue,
8340: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
8350: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
8360: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73         ** on a s
8370: 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20  econd ephemeral 
8380: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
8390: 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72   all values ever
83a0: 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20  y previously.   
83b0: 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
83c0: 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20   the queue. */. 
83d0: 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20         addrTest 
83e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
83f0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
8400: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20  nd, iParm+1, 0, 
8410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
8440: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8450: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
8460: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
8470: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
8480: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8490: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
84a0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
84b0: 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66  l, r3);.      if
84c0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
84d0: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
84e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
84f0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
8500: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33  ert, iParm+1, r3
8510: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8520: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
8530: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
8540: 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d  RESULT);.      }
8550: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8560: 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20  i<nKey; i++){.  
8570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8580: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
8590: 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  opy,.           
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
85b0: 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e  egResult + pSO->
85c0: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
85d0: 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20  yCol - 1,.      
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20      r2+i);.     
8600: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8610: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8620: 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d  _Sequence, iParm
8630: 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20  , r2+nKey);.    
8640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8650: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
8660: 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32  cord, r2, nKey+2
8670: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
8680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8690: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
86a0: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
86b0: 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29    if( addrTest )
86c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
86d0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74  Here(v, addrTest
86e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
86f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8700: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
8710: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
8720: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
8730: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
8740: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8750: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8760: 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
8770: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
8780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
8790: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
87a0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
87b0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
87c0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
87d0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
87e0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
87f0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
8800: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
8810: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
8820: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
8830: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
8840: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
8850: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
8860: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
8870: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
8880: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
8890: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
88a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
88b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
88c0: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
88d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
88e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
88f0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
8900: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
8910: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
8920: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
8930: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
8940: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
8950: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
8960: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
8970: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
8980: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
8990: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f  ..  */.  if( pSo
89a0: 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  rt==0 && p->iLim
89b0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
89c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
89d0: 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
89e0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
89f0: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
8a00: 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (v);.  }.}../*.*
8a10: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  * Allocate a Key
8a20: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66  Info object suff
8a30: 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  icient for an in
8a40: 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c  dex of N key col
8a50: 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78  umns and.** X ex
8a60: 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  tra columns..*/.
8a70: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
8a80: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c  KeyInfoAlloc(sql
8a90: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c  ite3 *db, int N,
8aa0: 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e   int X){.  KeyIn
8ab0: 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44  fo *p = sqlite3D
8ac0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a  bMallocZero(0, .
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ae0: 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66     sizeof(KeyInf
8af0: 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65  o) + (N+X)*(size
8b00: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29  of(CollSeq*)+1))
8b10: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
8b20: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d   p->aSortOrder =
8b30: 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b   (u8*)&p->aColl[
8b40: 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69  N+X];.    p->nFi
8b50: 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20  eld = (u16)N;.  
8b60: 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28    p->nXField = (
8b70: 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e  u16)X;.    p->en
8b80: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
8b90: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
8ba0: 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
8bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d  }else{.    db->m
8bc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
8bd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
8be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
8bf0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
8c00: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
8c10: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
8c20: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
8c30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
8c40: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
8c50: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d  );.    p->nRef--
8c60: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  ;.    if( p->nRe
8c70: 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62  f==0 ) sqlite3Db
8c80: 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a  Free(0, p);.  }.
8c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
8ca0: 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  new pointer to a
8cb0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
8cc0: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
8cd0: 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65  te3KeyInfoRef(Ke
8ce0: 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28  yInfo *p){.  if(
8cf0: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
8d00: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ( p->nRef>0 );. 
8d10: 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20     p->nRef++;.  
8d20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
8d30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8d40: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
8d50: 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79 49  n TRUE if a KeyI
8d60: 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  nfo object can b
8d70: 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b  e change.  The K
8d80: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  eyInfo object.**
8d90: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61   can only be cha
8da0: 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73 20  nged if this is 
8db0: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65  just a single re
8dc0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f  ference to the o
8dd0: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bject..**.** Thi
8de0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
8df0: 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66  d only inside of
8e00: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
8e10: 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
8e20: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
8e30: 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a  teable(KeyInfo *
8e40: 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52  p){ return p->nR
8e50: 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20  ef==1; }.#endif 
8e60: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
8e70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
8e80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
8e90: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
8ea0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
8eb0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
8ec0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
8ed0: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
8ee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
8ef0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
8f00: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
8f10: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
8f20: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
8f30: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
8f40: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
8f50: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
8f60: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
8f70: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
8f80: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
8f90: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
8fa0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
8fb0: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
8fc0: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
8fd0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
8fe0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
8ff0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
9000: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
9010: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
9020: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
9030: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
9040: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
9050: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
9060: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
9070: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
9080: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
9090: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
90a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
90b0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
90c0: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
90d0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
90e0: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
90f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
9100: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
9110: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
9120: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
9150: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
9160: 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66   Form the KeyInf
9170: 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68  o object from th
9180: 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20  is ExprList */. 
9190: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20   int iStart,    
91a0: 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77        /* Begin w
91b0: 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ith this column 
91c0: 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  of pList */.  in
91d0: 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20  t nExtra        
91e0: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
91f0: 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  any extra column
9200: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  s to the end */.
9210: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
9220: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
9230: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
9240: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
9250: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9260: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
9270: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
9280: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
9290: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
92a0: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
92b0: 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e   nExpr-iStart, n
92c0: 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20  Extra+1);.  if( 
92d0: 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73  pInfo ){.    ass
92e0: 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
92f0: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
9300: 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72  Info) );.    for
9310: 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d  (i=iStart, pItem
9320: 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74  =pList->a+iStart
9330: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
9340: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
9350: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
9360: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
9370: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
9380: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
9390: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
93a0: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
93b0: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
93c0: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
93d0: 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d  Coll[i-iStart] =
93e0: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49   pColl;.      pI
93f0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
9400: 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65  i-iStart] = pIte
9410: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
9420: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9430: 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pInfo;.}../*.**
9440: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
9450: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
9460: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
9470: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
9480: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9490: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
94a0: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
94b0: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
94c0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
94d0: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
94e0: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
94f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
9500: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
9510: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
9520: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9530: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
9540: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
9550: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
9560: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
9570: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
9580: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
9590: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
95a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
95b0: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  LAIN./*.** Unles
95c0: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
95d0: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
95e0: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
95f0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9600: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9610: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9620: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9630: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9640: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9650: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
9660: 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  tion is of the f
9670: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53  orm:.**.**   "US
9680: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
9690: 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65  R xxx".**.** whe
96a0: 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66  re xxx is one of
96b0: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52   "DISTINCT", "OR
96c0: 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55  DER BY" or "GROU
96d0: 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77  P BY". Exactly w
96e0: 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72  hich.** is deter
96f0: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73  mined by the zUs
9700: 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  age argument..*/
9710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9720: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61  lainTempTable(Pa
9730: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
9740: 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29  st char *zUsage)
9750: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
9760: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
9770: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9780: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
9790: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
97a0: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
97b0: 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50  e->db, "USE TEMP
97c0: 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c   B-TREE FOR %s",
97d0: 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71   zUsage);.    sq
97e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
97f0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
9800: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
9810: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
9820: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
9830: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65  ../*.** Assign e
9840: 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c  xpression b to l
9850: 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e  value a. A secon
9860: 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f  d, no-op, versio
9870: 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a  n of this macro.
9880: 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77  ** is provided w
9890: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  hen SQLITE_OMIT_
98a0: 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e  EXPLAIN is defin
98b0: 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ed. This allows 
98c0: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73  the code.** in s
98d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74  qlite3Select() t
98e0: 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20  o assign values 
98f0: 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d  to structure mem
9900: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  ber variables th
9910: 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74  at.** only exist
9920: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
9930: 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64  EXPLAIN is not d
9940: 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70  efined without p
9950: 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20  olluting the.** 
9960: 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65  code with #ifnde
9970: 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f  f directives..*/
9980: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
9990: 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62  nSetInteger(a, b
99a0: 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f  ) a = b..#else./
99b0: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
99c0: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
99d0: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
99e0: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
99f0: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65  define explainTe
9a00: 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64  mpTable(y,z).# d
9a10: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
9a20: 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e  Integer(y,z).#en
9a30: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
9a40: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
9a50: 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e  PLAIN) && !defin
9a60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
9a70: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a  OMPOUND_SELECT).
9a80: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
9a90: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
9aa0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
9ab0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
9ac0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
9ad0: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
9ae0: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
9af0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
9b00: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
9b10: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
9b20: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
9b30: 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
9b40: 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a   two forms:.**.*
9b50: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
9b60: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
9b70: 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a  and iSub2 (op)".
9b80: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
9b90: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
9ba0: 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47   and iSub2 USING
9bb0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70   TEMP B-TREE (op
9bc0: 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69  )".**.** where i
9bd0: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61  Sub1 and iSub2 a
9be0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20  re the integers 
9bf0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
9c00: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66  rresponding.** f
9c10: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
9c20: 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68  rs, and op is th
9c30: 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  e text represent
9c40: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
9c50: 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
9c60: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20   same name. The 
9c70: 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d  parameter "op" m
9c80: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b  ust be one of TK
9c90: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
9ca0: 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45  T,.** TK_INTERSE
9cb0: 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68  CT or TK_ALL. Th
9cc0: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20  e first form is 
9cd0: 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74  used if argument
9ce0: 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20   bUseTmp is .** 
9cf0: 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65  false, or the se
9d00: 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20  cond form if it 
9d10: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
9d20: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43  ic void explainC
9d30: 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73  omposite(.  Pars
9d40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9d60: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
9d70: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
9da0: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20  NION, TK_EXCEPT 
9db0: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  etc. */.  int iS
9dc0: 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub1,            
9dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
9de0: 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20  query id 1 */.  
9df0: 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20  int iSub2,      
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32  /* Subquery id 2
9e20: 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d   */.  int bUseTm
9e30: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
9e40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
9e50: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61   a temp table wa
9e60: 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  s used */.){.  a
9e70: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e  ssert( op==TK_UN
9e80: 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58  ION || op==TK_EX
9e90: 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
9ea0: 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d  NTERSECT || op==
9eb0: 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20  TK_ALL );.  if( 
9ec0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
9ed0: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
9ee0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9ef0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
9f00: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
9f10: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
9f20: 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e  se->db, "COMPOUN
9f30: 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20  D SUBQUERIES %d 
9f40: 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20  AND %d %s(%s)", 
9f50: 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20  iSub1, iSub2,.  
9f60: 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55        bUseTmp?"U
9f70: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
9f80: 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e   ":"", selectOpN
9f90: 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20  ame(op).    );. 
9fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9fb0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9fc0: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9fd0: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9fe0: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
9ff0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e    }.}.#else./* N
a000: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
a010: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
a020: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
a030: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
a040: 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ine explainCompo
a050: 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a  site(v,w,x,y,z).
a060: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
a070: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
a080: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
a090: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
a0a0: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
a0b0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
a0c0: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
a0d0: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
a0e0: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
a0f0: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
a100: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
a110: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
a120: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
a130: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
a140: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
a150: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
a160: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
a170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a180: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
a190: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
a1a0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a1b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
a1c0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
a1d0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
a1e0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f  tatement */.  So
a1f0: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
a200: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  /* Information o
a210: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
a220: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
a230: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20  Column,      /* 
a240: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
a250: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53  s of data */.  S
a260: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
a270: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
a280: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
a290: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
a2a0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a2b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a2c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
a2d0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a2e0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
a2f0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
a300: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
a310: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
a320: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
a330: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
a340: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
a350: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
a360: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
a370: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
a380: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
a390: 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
a3a0: 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72  int iTab;.  Expr
a3b0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
a3c0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
a3d0: 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ;.  int eDest = 
a3e0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
a3f0: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
a400: 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e  t->iSDParm;.  in
a410: 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20  t regRow;.  int 
a420: 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  regRowid;.  int 
a430: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
a440: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
a450: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
a460: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
a470: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
a480: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
a490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a4a0: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
a4b0: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
a4c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  r */.  int i;.  
a4d0: 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20  int bSeq;       
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65  /* True if sorte
a500: 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65  r record include
a510: 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69  s seq. no. */.#i
a520: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a530: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
a540: 4e 54 53 0a 20 20 73 74 72 75 63 74 20 45 78 70  NTS.  struct Exp
a550: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74  rList_item *aOut
a560: 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Ex = p->pEList->
a570: 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  a;.#endif..  if(
a580: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a590: 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
a5a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a5b0: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
a5c0: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
a5d0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
a5e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
a5f0: 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  to(v, addrBreak)
a600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a610: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a620: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a630: 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20  ut);.  }.  iTab 
a640: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
a650: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
a660: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
a670: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
a680: 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  ne ){.    regRow
a690: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
a6a0: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
a6b0: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
a6c0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
a6d0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
a6e0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
a6f0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a700: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
a710: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a720: 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74  arse);.    nSort
a730: 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Data = 1;.  }.  
a740: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
a750: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
a760: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
a770: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
a780: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
a790: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
a7a0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
a7b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
a7c0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
a7d0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
a7e0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
a7f0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
a800: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
a810: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
a820: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
a830: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
a840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a850: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
a860: 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f   iSortTab, regSo
a870: 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53  rtOut, nKey+1+nS
a880: 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ortData);.    if
a890: 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c  ( addrOnce ) sql
a8a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a8b0: 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
a8c0: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
a8d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a8e0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
a8f0: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
a900: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
a910: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
a920: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
a930: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
a940: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
a950: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a960: 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54  P_SorterData, iT
a970: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
a980: 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62  iSortTab);.    b
a990: 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Seq = 0;.  }else
a9a0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
a9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a9c0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
a9d0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
a9e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a9f0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
aa00: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
aa10: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
aa20: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54     iSortTab = iT
aa30: 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31  ab;.    bSeq = 1
aa40: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
aa50: 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b   i<nSortData; i+
aa60: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
aa70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
aa80: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
aa90: 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72  , nKey+bSeq+i, r
aaa0: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64  egRow+i);.    Vd
aab0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
aac0: 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  s", aOutEx[i].zN
aad0: 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e  ame ? aOutEx[i].
aae0: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
aaf0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20  ].zSpan));.  }. 
ab00: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
ab10: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  {.    case SRT_E
ab20: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
ab30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab40: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
ab50: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
ab60: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
ab70: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ab80: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
ab90: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
aba0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
abb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
abc0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
abd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
abe0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
abf0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
ac00: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
ac10: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
ac20: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
ac30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ac40: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
ac50: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
ac60: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
ac70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ac80: 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d           &pDest-
ac90: 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20  >affSdst, 1);.  
aca0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
acb0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
acc0: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ge(pParse, regRo
acd0: 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  w, 1);.      sql
ace0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
acf0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
ad00: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
ad10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ad20: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
ad30: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
ad40: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
ad50: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
ad60: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
ad70: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69  Parse, regRow, i
ad80: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
ad90: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
ada0: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
adb0: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
adc0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
add0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
ade0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
adf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
ae00: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
ae10: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
ae20: 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20  outine ); .     
ae30: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
ae40: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
ae50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ae60: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
ae70: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  tine );.      if
ae80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
ae90: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
aea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aeb0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
aec0: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
aed0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
aee0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
aef0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
af00: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e  (pParse, pDest->
af10: 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  iSdst, nColumn);
af20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
af30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af40: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
af50: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
af60: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
af70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
af80: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f  .  }.  if( regRo
af90: 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  wid ){.    sqlit
afa0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
afb0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29  (pParse, regRow)
afc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
afd0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
afe0: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
aff0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74   }.  /* The bott
b000: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
b010: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
b020: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
b030: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
b040: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
b050: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
b060: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
b070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b080: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
b090: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
b0a0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
b0b0: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
b0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b0d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
b0e0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
b0f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b100: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72  }.  if( pSort->r
b110: 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74  egReturn ) sqlit
b120: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b130: 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  OP_Return, pSort
b140: 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
b150: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
b160: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
b170: 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reak);.}../*.** 
b180: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
b190: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
b1a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
b1b0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
b1c0: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
b1d0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
b1e0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
b1f0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
b200: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
b210: 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20  .** Also try to 
b220: 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a  estimate the siz
b230: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
b240: 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  d value and retu
b250: 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  rn that.** resul
b260: 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e  t in *pEstWidth.
b270: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
b280: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
b290: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
b2a0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
b2b0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
b2c0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
b2d0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
b2e0: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
b2f0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
b300: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
b310: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
b320: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
b330: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
b340: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
b350: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
b360: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
b370: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
b380: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
b390: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
b3a0: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
b3b0: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
b3c0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
b3d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b3e0: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
b3f0: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
b400: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
b410: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
b420: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
b430: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
b440: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
b450: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
b460: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
b470: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
b480: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
b490: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
b4a0: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
b4b0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
b4c0: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
b4d0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
b4e0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
b4f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b500: 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20  ne has either 3 
b510: 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20  or 6 parameters 
b520: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
b530: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
b540: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
b550: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b560: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
b570: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f  tion is used..*/
b580: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b590: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b5a0: 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63  ADATA.# define c
b5b0: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
b5c0: 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70  D,E,F) columnTyp
b5d0: 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c  eImpl(A,B,C,D,E,
b5e0: 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  F).#else /* if !
b5f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
b600: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b610: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
b620: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
b630: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
b640: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29  nTypeImpl(A,B,F)
b650: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
b660: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
b670: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
b680: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
b690: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 23    Expr *pExpr,.#
b6a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b6b0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
b6c0: 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ATA.  const char
b6d0: 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63   **pzOrigDb,.  c
b6e0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
b6f0: 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  igTab,.  const c
b700: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c  har **pzOrigCol,
b710: 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a 70 45  .#endif.  u8 *pE
b720: 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61  stWidth.){.  cha
b730: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
b740: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75   0;.  int j;.  u
b750: 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a  8 estWidth = 1;.
b760: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b770: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b780: 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e 73  DATA.  char cons
b790: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
b7a0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
b7b0: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
b7c0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
b7d0: 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ol = 0;.#endif..
b7e0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
b7f0: 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53  r==0) || pNC->pS
b800: 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  rcList==0 ) retu
b810: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
b820: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
b830: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
b840: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
b850: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
b860: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
b870: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
b880: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
b890: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
b8a0: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
b8b0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
b8c0: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
b8d0: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
b8e0: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
b8f0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
b900: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
b910: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
b920: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
b930: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
b940: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
b950: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
b960: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
b970: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
b980: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b990: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
b9a0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
b9b0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
b9c0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
b9d0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
b9e0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
b9f0: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
ba00: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
ba10: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
ba20: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
ba30: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
ba40: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
ba50: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
ba60: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
ba70: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
ba80: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
ba90: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
baa0: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
bab0: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
bac0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
bad0: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
bae0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
baf0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
bb00: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
bb10: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
bb20: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
bb30: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
bb40: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
bb50: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
bb60: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
bb70: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
bb80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
bb90: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
bba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
bbb0: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
bbc0: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
bbd0: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
bbe0: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
bbf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
bc00: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
bc10: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
bc20: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
bc30: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
bc40: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
bc50: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
bc60: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
bc70: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
bc80: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
bc90: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
bca0: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
bcb0: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
bcc0: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
bcd0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
bce0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
bcf0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
bd00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
bd10: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
bd20: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
bd30: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
bd40: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
bd50: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
bd60: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
bd70: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
bd80: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
bd90: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
bda0: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
bdb0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
bdc0: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
bdd0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
bde0: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
bdf0: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
be00: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
be10: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
be20: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
be30: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
be40: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
be50: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
be60: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
be70: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
be80: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
be90: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
bea0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
beb0: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
bec0: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
bed0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
bee0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
bef0: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
bf00: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
bf10: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
bf20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
bf40: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
bf50: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
bf60: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
bf70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
bf80: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
bf90: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
bfa0: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
bfb0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
bfc0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
bfd0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
bfe0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
bff0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
c000: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
c010: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
c020: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
c030: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
c040: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
c050: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c060: 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  l>=0 && ALWAYS(i
c070: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
c080: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
c090: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
c0a0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
c0b0: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
c0c0: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
c0d0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
c0e0: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
c0f0: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
c100: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
c110: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
c120: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
c130: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
c140: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
c150: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
c160: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
c170: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 41          ** The A
c180: 4c 57 41 59 53 28 29 20 69 73 20 62 65 63 61 75  LWAYS() is becau
c190: 73 65 20 69 43 6f 6c 3e 3d 70 53 2d 3e 70 45 4c  se iCol>=pS->pEL
c1a0: 69 73 74 2d 3e 6e 45 78 70 72 20 77 69 6c 6c 20  ist->nExpr will 
c1b0: 68 61 76 65 20 62 65 65 6e 0a 20 20 20 20 20 20  have been.      
c1c0: 20 20 20 20 2a 2a 20 63 61 75 67 68 74 20 61 6c      ** caught al
c1d0: 72 65 61 64 79 20 62 79 20 6e 61 6d 65 20 72 65  ready by name re
c1e0: 73 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20 20 20 20  solution..      
c1f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
c200: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
c210: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
c220: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
c230: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
c240: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
c250: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
c260: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
c270: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
c280: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
c290: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
c2a0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
c2b0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
c2c0: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
c2d0: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
c2e0: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
c2f0: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
c300: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
c310: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
c320: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
c330: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
c340: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
c350: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c360: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
c370: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
c380: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
c390: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
c3a0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
c3b0: 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) );.#ifdef SQLI
c3c0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c3d0: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20  _METADATA.      
c3e0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
c3f0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
c400: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
c410: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
c420: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
c430: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c440: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
c450: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
c460: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  pe;.          zO
c470: 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  rigCol = pTab->a
c480: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
c490: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
c4a0: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
c4b0: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
c4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c4d0: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
c4e0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
c4f0: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
c500: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
c510: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
c520: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
c530: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
c540: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
c550: 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d         zOrigDb =
c560: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
c570: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
c580: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
c590: 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  e.        if( iC
c5a0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
c5b0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
c5c0: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ER";.        }el
c5d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
c5e0: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
c5f0: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
c600: 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74 68          estWidth
c610: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
c620: 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20  ol].szEst;.     
c630: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
c640: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
c650: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
c660: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
c670: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
c680: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
c690: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
c6a0: 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  n is a sub-selec
c6b0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
c6c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
c6d0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67  nd.      ** orig
c6e0: 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20  in info for the 
c6f0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e  single column in
c700: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
c710: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
c720: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
c730: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c740: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
c750: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
c760: 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  pS = pExpr->x.pS
c770: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
c780: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
c790: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
c7a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
c7b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
c7c0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
c7d0: 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ) );.      sNC.p
c7e0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
c7f0: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
c800: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
c810: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
c820: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
c830: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
c840: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
c850: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
c860: 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73  , &zOrigCol, &es
c870: 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20  tWidth); .      
c880: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
c890: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  dif.  }..#ifdef 
c8a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c8b0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a  LUMN_METADATA  .
c8c0: 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29    if( pzOrigDb )
c8d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a  {.    assert( pz
c8e0: 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69  OrigTab && pzOri
c8f0: 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f  gCol );.    *pzO
c900: 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b  rigDb = zOrigDb;
c910: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20  .    *pzOrigTab 
c920: 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20  = zOrigTab;.    
c930: 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72  *pzOrigCol = zOr
c940: 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69  igCol;.  }.#endi
c950: 66 0a 20 20 69 66 28 20 70 45 73 74 57 69 64 74  f.  if( pEstWidt
c960: 68 20 29 20 2a 70 45 73 74 57 69 64 74 68 20 3d  h ) *pEstWidth =
c970: 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65 74   estWidth;.  ret
c980: 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a  urn zType;.}../*
c990: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
c9a0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
c9b0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65   the VDBE the de
c9c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20  claration types 
c9d0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
c9e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
c9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ca00: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
ca10: 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pes(.  Parse *pP
ca20: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
ca30: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
ca40: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
ca50: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
ca60: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
ca70: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
ca80: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
ca90: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
caa0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69  ult set */.){.#i
cab0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cac0: 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62  T_DECLTYPE.  Vdb
cad0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
cae0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
caf0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
cb00: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
cb10: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73   = pTabList;.  s
cb20: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
cb30: 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  se;.  for(i=0; i
cb40: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
cb50: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
cb60: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
cb70: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
cb80: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23  t char *zType;.#
cb90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cba0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
cbb0: 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ATA.    const ch
cbc0: 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  ar *zOrigDb = 0;
cbd0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
cbe0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
cbf0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cc00: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  OrigCol = 0;.   
cc10: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
cc20: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
cc30: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
cc40: 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b  , &zOrigCol, 0);
cc50: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
cc60: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
cc70: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
cc80: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
cc90: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
cca0: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
ccb0: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
ccc0: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
ccd0: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
cce0: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
ccf0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
cd00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
cd10: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
cd20: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
cd30: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
cd40: 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  Db, SQLITE_TRANS
cd50: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
cd60: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
cd70: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
cd80: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
cd90: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
cda0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
cdb0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
cdc0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
cdd0: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c  N, zOrigCol, SQL
cde0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
cdf0: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
ce00: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
ce10: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  C, p, 0, 0, 0, 0
ce20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
ce30: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
ce40: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
ce50: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
ce60: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
ce70: 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ENT);.  }.#endif
ce80: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
ce90: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
cea0: 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E) */.}../*.** G
ceb0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
cec0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
ced0: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
cee0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
cef0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
cf00: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
cf10: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
cf20: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
cf30: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
cf40: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
cf50: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
cf60: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
cf70: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cf80: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
cf90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
cfa0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
cfb0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
cfc0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
cfd0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
cfe0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
cff0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
d000: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
d010: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
d020: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
d030: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d040: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
d050: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
d060: 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65  rtNames;..#ifnde
d070: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
d080: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
d090: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
d0a0: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
d0b0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
d0c0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
d0d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
d0e0: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73  dif..  if( pPars
d0f0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
d100: 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c  | NEVER(v==0) ||
d110: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d120: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  d ) return;.  pP
d130: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
d140: 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
d150: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
d160: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
d170: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f  Names)!=0;.  sho
d180: 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  rtNames = (db->f
d190: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
d1a0: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ortColNames)!=0;
d1b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
d1c0: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
d1d0: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
d1e0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
d1f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d200: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70    Expr *p;.    p
d210: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
d220: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e  pExpr;.    if( N
d230: 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e  EVER(p==0) ) con
d240: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
d250: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
d260: 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
d270: 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
d280: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
d290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d2a0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d2b0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
d2c0: 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  me, SQLITE_TRANS
d2d0: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
d2e0: 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f   if( (p->op==TK_
d2f0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d  COLUMN || p->op=
d300: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
d310: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
d320: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
d330: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
d340: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
d350: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
d360: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
d370: 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73  ALWAYS(j<pTabLis
d380: 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a  t->nSrc); j++){.
d390: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
d3a0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
d3b0: 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20  or==p->iTable ) 
d3c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d3d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
d3e0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
d3f0: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
d400: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
d410: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
d420: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
d430: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
d440: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
d450: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
d460: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
d470: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
d480: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
d490: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
d4a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d4b0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
d4c0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
d4d0: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
d4e0: 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65    if( !shortName
d4f0: 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20  s && !fullNames 
d500: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d510: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d520: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
d530: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
d540: 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75    sqlite3DbStrDu
d550: 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
d560: 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54  i].zSpan), SQLIT
d570: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
d580: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c    }else if( full
d590: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
d5a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
d5b0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
d5c0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d5d0: 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  (db, "%s.%s", pT
d5e0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ab->zName, zCol)
d5f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d600: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d610: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d620: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
d630: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
d640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d650: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d660: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d670: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
d680: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d690: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
d6a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
d6b0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c  st char *z = pEL
d6c0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
d6d0: 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20  .      z = z==0 
d6e0: 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  ? sqlite3MPrintf
d6f0: 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  (db, "column%d",
d700: 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44   i+1) : sqlite3D
d710: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a  bStrDup(db, z);.
d720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d730: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d740: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d750: 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  z, SQLITE_DYNAMI
d760: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  C);.    }.  }.  
d770: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
d780: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
d790: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
d7a0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
d7b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d7c0: 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
d7d0: 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  y the list of ex
d7e0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
d7f0: 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c  t form the resul
d800: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
d810: 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d  T statement) com
d820: 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65  pute appropriate
d830: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** column names
d840: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
d850: 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  t would hold the
d860: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d870: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75  ..**.** All colu
d880: 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65  mn names will be
d890: 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f   unique..**.** O
d8a0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
d8b0: 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65  ames are compute
d8c0: 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  d.  Column.zType
d8d0: 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a  , Column.zColl,.
d8e0: 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
d8f0: 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72  lds of Column ar
d900: 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
d910: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
d920: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
d930: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
d940: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
d950: 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c  s,.** store NULL
d960: 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30   in *paCol and 0
d970: 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72   in *pnCol and r
d980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d990: 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  EM..*/.int sqlit
d9a0: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
d9b0: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
d9c0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d9d0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d9e0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
d9f0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
da00: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
da10: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
da20: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
da30: 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da50: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
da60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
da70: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
da80: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
da90: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
daa0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
dab0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
dac0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
dad0: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
dae0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
daf0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
db00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
db10: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
db20: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db40: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
db50: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
db60: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
db70: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
db80: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
db90: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
dba0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
dbb0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
dbc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
dbd0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
dbe0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
dbf0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
dc20: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
dc30: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
dc40: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
dc60: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
dc70: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
dc90: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
dca0: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28  Name[] */..  if(
dcb0: 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e   pEList ){.    n
dcc0: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
dcd0: 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20  xpr;.    aCol = 
dce0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
dcf0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61  ero(db, sizeof(a
dd00: 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20  Col[0])*nCol);. 
dd10: 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f     testcase( aCo
dd20: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  l==0 );.  }else{
dd30: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
dd40: 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
dd50: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
dd60: 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f  ;.  *paCol = aCo
dd70: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l;..  for(i=0, p
dd80: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
dd90: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
dda0: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
ddb0: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
ddc0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
ddd0: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c    */.    p = sql
dde0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
ddf0: 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ate(pEList->a[i]
de00: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
de10: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
de20: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
de30: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
de40: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
de50: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
de60: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
de70: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
de80: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
de90: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
dea0: 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  up(db, zName);. 
deb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dec0: 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d  Expr *pColExpr =
ded0: 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72   p;  /* The expr
dee0: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74  ession that is t
def0: 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
df00: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54   name */.      T
df10: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
df20: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73      /* Table ass
df30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
df40: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
df50: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
df60: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
df70: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
df80: 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
df90: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
dfa0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
dfb0: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
dfc0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
dfd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
dfe0: 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f  MN && ALWAYS(pCo
dff0: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20  lExpr->pTab!=0) 
e000: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
e010: 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
e020: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
e030: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
e040: 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
e050: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
e060: 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45      pTab = pColE
e070: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
e080: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
e090: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
e0a0: 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
e0b0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
e0c0: 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20  tf(db, "%s",.   
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
e0e0: 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43  ol>=0 ? pTab->aC
e0f0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a  ol[iCol].zName :
e100: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
e110: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45   }else if( pColE
e120: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
e130: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e140: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
e150: 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f  ty(pColExpr, EP_
e160: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
e170: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
e180: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
e190: 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e  "%s", pColExpr->
e1a0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
e1b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e1c0: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
e1d0: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
e1e0: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
e1f0: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
e200: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e210: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e220: 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  db, "%s", pEList
e230: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
e240: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e250: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
e260: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
e270: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e280: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62   zName);.      b
e290: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
e2a0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
e2b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
e2c0: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
e2d0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
e2e0: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
e2f0: 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f  nd an integer to
e300: 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61   the name so tha
e310: 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69  t it becomes uni
e320: 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  que..    */.    
e330: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
e340: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
e350: 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b      for(j=cnt=0;
e360: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
e370: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
e380: 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  ICmp(aCol[j].zNa
e390: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  me, zName)==0 ){
e3a0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
e3b0: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
e3c0: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
e3d0: 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b  for(k=nName-1; k
e3e0: 3e 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 64  >1 && sqlite3Isd
e3f0: 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20  igit(zName[k]); 
e400: 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69  k--){}.        i
e410: 66 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d 65  f( k>=0 && zName
e420: 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [k]==':' ) nName
e430: 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = k;.        zN
e440: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
e450: 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65          zNewName
e460: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
e470: 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a  f(db, "%s:%d", z
e480: 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20  Name, ++cnt);.  
e490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e4a0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
e4b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
e4c0: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
e4d0: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
e4e0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
e4f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e500: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
e510: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
e520: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
e530: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
e540: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
e550: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
e560: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
e570: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
e580: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
e590: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a  Free(db, aCol);.
e5a0: 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a      *paCol = 0;.
e5b0: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a      *pnCol = 0;.
e5c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e5d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
e5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
e600: 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
e610: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
e620: 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
e630: 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
e640: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
e650: 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
e660: 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
e670: 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
e680: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
e690: 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
e6a0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
e6b0: 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
e6c0: 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
e6d0: 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
e6e0: 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
e6f0: 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
e700: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
e710: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
e720: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
e730: 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
e740: 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
e750: 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
e760: 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
e770: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e780: 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
e790: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
e7a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e7b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
e7c0: 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
e7d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
e7e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
e7f0: 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72  olumn type infor
e800: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74  mation to this t
e810: 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
e820: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
e830: 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
e840: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
e850: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
e860: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e870: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e880: 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
e890: 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
e8a0: 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
e8b0: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
e8c0: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
e8d0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
e8e0: 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41  em *a;.  u64 szA
e8f0: 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ll = 0;..  asser
e900: 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  t( pSelect!=0 );
e910: 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c  .  assert( (pSel
e920: 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
e930: 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20  SF_Resolved)!=0 
e940: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
e950: 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74  b->nCol==pSelect
e960: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
e970: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
e980: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
e990: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
e9a0: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74  return;.  memset
e9b0: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
e9c0: 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53  (sNC));.  sNC.pS
e9d0: 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  rcList = pSelect
e9e0: 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53  ->pSrc;.  a = pS
e9f0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
ea00: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
ea10: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c  l=pTab->aCol; i<
ea20: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
ea30: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20   pCol++){.    p 
ea40: 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[i].pExpr;.  
ea50: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 54 79 70    if( pCol->zTyp
ea60: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  e==0 ){.      pC
ea70: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
ea80: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ea90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eaa0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 54           columnT
eab0: 79 70 65 28 26 73 4e 43 2c 20 70 2c 30 2c 30 2c  ype(&sNC, p,0,0,
eac0: 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29  0, &pCol->szEst)
ead0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 41  );.    }.    szA
eae0: 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73  ll += pCol->szEs
eaf0: 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  t;.    pCol->aff
eb00: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
eb10: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
eb20: 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66      if( pCol->af
eb30: 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c  finity==0 ) pCol
eb40: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
eb50: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
eb60: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
eb70: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
eb80: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
eb90: 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e   pColl && pCol->
eba0: 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  zColl==0 ){.    
ebb0: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
ebc0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ebd0: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
ebe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
ebf0: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
ec00: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a  sqlite3LogEst(sz
ec10: 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  All*4);.}../*.**
ec20: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
ec30: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
ec40: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
ec50: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
ec60: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
ec70: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
ec80: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
ec90: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
eca0: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
ecb0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
ecc0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
ecd0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
ece0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ecf0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
ed00: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
ed10: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
ed20: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
ed30: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
ed40: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
ed50: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
ed60: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
ed70: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
ed80: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ed90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
eda0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
edb0: 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
edc0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
edd0: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
ede0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
edf0: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
ee00: 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
ee10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
ee20: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
ee30: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
ee40: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
ee50: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
ee60: 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
ee70: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
ee80: 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
ee90: 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
eea0: 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
eeb0: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
eec0: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
eed0: 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b  e.bEnabled==0 );
eee0: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
eef0: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
ef00: 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
ef10: 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
ef20: 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
ef30: 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
ef40: 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  76) );.  sqlite3
ef50: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
ef60: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
ef70: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
ef80: 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
ef90: 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74  >aCol);.  select
efa0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
efb0: 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
efc0: 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29  , pTab, pSelect)
efd0: 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
efe0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
eff0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
f000: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
f010: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
f020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f030: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
f040: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  b;.}../*.** Get 
f050: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
f060: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
f070: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
f080: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
f090: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
f0a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
f0b0: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
f0c0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
f0d0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
f0e0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
f0f0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
f100: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
f110: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
f120: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
f130: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
f140: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
f150: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
f160: 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64  f( v ) sqlite3Vd
f170: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49  beAddOp0(v, OP_I
f180: 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  nit);.    if( pP
f190: 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
f1a0: 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  =0.     && Optim
f1b0: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
f1c0: 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
f1d0: 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
f1e0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50  .    ){.      pP
f1f0: 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
f200: 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  tor = 1;.    }..
f210: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
f220: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
f230: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
f240: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
f250: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
f260: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
f270: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
f280: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
f290: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
f2a0: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
f2b0: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
f2c0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
f2d0: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
f2e0: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
f2f0: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
f300: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
f310: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
f320: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
f330: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
f340: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
f350: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
f360: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
f370: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
f380: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
f390: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
f3a0: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
f3b0: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
f3c0: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
f3d0: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
f3e0: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
f3f0: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
f400: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
f410: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
f420: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
f430: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
f440: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
f450: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
f460: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f470: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
f480: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
f490: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
f4a0: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
f4b0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
f4c0: 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72   (zero).** prior
f4d0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
f4e0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
f4f0: 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69  The iOffset regi
f500: 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73  ster (if it exis
f510: 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ts) is initializ
f520: 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ed to the value.
f530: 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54  ** of the OFFSET
f540: 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65  .  The iLimit re
f550: 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61  gister is initia
f560: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20  lized to LIMIT. 
f570: 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66   Register.** iOf
f580: 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61  fset+1 is initia
f590: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f  lized to LIMIT+O
f5a0: 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  FFSET..**.** Onl
f5b0: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
f5c0: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
f5d0: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
f5e0: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
f5f0: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
f600: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
f610: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
f620: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
f630: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
f640: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
f650: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
f660: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
f670: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f680: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
f690: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
f6a0: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
f6b0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
f6c0: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
f6d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
f6e0: 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
f6f0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
f700: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70    int n;.  if( p
f710: 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
f720: 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
f730: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
f740: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
f750: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
f760: 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
f770: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
f780: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
f790: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
f7a0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
f7b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
f7c0: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
f7d0: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
f7e0: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
f7f0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
f800: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61  ear(pParse);.  a
f810: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
f820: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
f830: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  t!=0 );.  if( p-
f840: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
f850: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
f860: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
f870: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
f880: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f890: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
f8a0: 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  v!=0 );.    if( 
f8b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
f8c0: 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20  eger(p->pLimit, 
f8d0: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  &n) ){.      sql
f8e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f8f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c  , OP_Integer, n,
f900: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
f910: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
f920: 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
f930: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  );.      if( n==
f940: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
f950: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
f960: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
f970: 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26  else if( n>=0 &&
f980: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28   p->nSelectRow>(
f990: 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20  u64)n ){.       
f9a0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
f9b0: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
f9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f9d0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f9e0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
f9f0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
fa00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fa10: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
fa20: 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
fa30: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fa40: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
fa50: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
fa60: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
fa70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fa80: 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74  OP_IfNot, iLimit
fa90: 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
faa0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fab0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66  }.    if( p->pOf
fac0: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  fset ){.      p-
fad0: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
fae0: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
faf0: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
fb00: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
fb10: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
fb20: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
fb30: 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
fb40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fb50: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
fb60: 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
fb70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fb80: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fb90: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66  _MustBeInt, iOff
fba0: 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
fbb0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
fbc0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
fbd0: 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
fbe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fbf0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
fc00: 65 74 49 66 4e 6f 74 50 6f 73 2c 20 69 4f 66 66  etIfNotPos, iOff
fc10: 73 65 74 2c 20 69 4f 66 66 73 65 74 2c 20 30 29  set, iOffset, 0)
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: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fca0: 33 28 76 2c 20 4f 50 5f 53 65 74 49 66 4e 6f 74  3(v, OP_SetIfNot
fcb0: 50 6f 73 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  Pos, iLimit, iOf
fcc0: 66 73 65 74 2b 31 2c 20 2d 31 29 3b 0a 20 20 20  fset+1, -1);.   
fcd0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
fce0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
fcf0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
fd00: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
fd10: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
fd20: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
fd30: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
fd40: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
fd50: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
fd60: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
fd70: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
fd80: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
fd90: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
fda0: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
fdb0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fdc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
fdd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
fde0: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
fdf0: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
fe00: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
fe10: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
fe20: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
fe30: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
fe40: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
fe50: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
fe60: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
fe70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
fe80: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
fe90: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
fea0: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
feb0: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
fec0: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
fed0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
fee0: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
fef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
ff00: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
ff10: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
ff20: 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65   /* iCol must be
ff30: 20 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45   less than p->pE
ff40: 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74  List->nExpr.  Ot
ff50: 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
ff60: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65   would.  ** have
ff70: 20 62 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72   been thrown dur
ff80: 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ing name resolut
ff90: 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ion and we would
ffa0: 20 6e 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e   not have gotten
ffb0: 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a  .  ** this far *
ffc0: 2f 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  /.  if( pRet==0 
ffd0: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
ffe0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
fff0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
10000 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
10010 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
10020 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
10030 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
10040 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
10050 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
10060 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
10070 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
10080 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75  eter is a compou
10090 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  nd SELECT.** wit
100a0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
100b0 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ause. This funct
100c0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
100d0 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49  d returns a KeyI
100e0 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
100f0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d   suitable for im
10100 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
10110 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53  RDER BY..**.** S
10120 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
10130 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
10140 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
10150 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20  rom malloc. The 
10160 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
10170 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
10180 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
10190 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
101a0 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
101b0 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73  y.** freed..*/.s
101c0 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d  tatic KeyInfo *m
101d0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
101e0 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a  yKeyInfo(Parse *
101f0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
10200 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a  p, int nExtra){.
10210 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10220 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
10230 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  By;.  int nOrder
10240 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
10250 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74  ->nExpr;.  sqlit
10260 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10270 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  >db;.  KeyInfo *
10280 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65  pRet = sqlite3Ke
10290 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
102a0 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20  OrderBy+nExtra, 
102b0 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  1);.  if( pRet )
102c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
102d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
102e0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
102f0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10300 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
10310 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b  &pOrderBy->a[i];
10320 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
10330 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  rm = pItem->pExp
10340 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  r;.      CollSeq
10350 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20   *pColl;..      
10360 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
10370 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
10380 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
10390 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
103a0 53 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72  Seq(pParse, pTer
103b0 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
103c0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
103d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
103e0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70  Seq(pParse, p, p
103f0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
10400 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ByCol-1);.      
10410 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
10420 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
10430 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
10440 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
10450 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Expr =.         
10460 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
10470 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61  ollateString(pPa
10480 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c  rse, pTerm, pCol
10490 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
104a0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
104b0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
104c0 73 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29  sWriteable(pRet)
104d0 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   );.      pRet->
104e0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
104f0 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53  ;.      pRet->aS
10500 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
10510 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
10520 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
10530 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
10540 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
10550 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
10560 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10570 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63  generates VDBE c
10580 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ode to compute t
10590 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
105a0 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a  WITH RECURSIVE.*
105b0 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  * query of the f
105c0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65  orm:.**.**   <re
105d0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41  cursive-table> A
105e0 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e  S (<setup-query>
105f0 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65   UNION [ALL] <re
10600 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a  cursive-query>).
10610 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10620 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
10630 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
10640 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
10650 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20      p->pPrior   
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68     p.**.**.** Th
106a0 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
106b0 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
106c0 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
106d0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
106e0 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63  clause.** of rec
106f0 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61  ursive-query, ma
10700 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72  rked with the Sr
10710 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73  cList->a[].fg.is
10720 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a  Recursive flag..
10730 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d  **.** The setup-
10740 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20  query runs once 
10750 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69  to generate an i
10760 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f  nitial set of ro
10770 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e  ws that go.** in
10780 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c 65  to a Queue table
10790 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74 72  .  Rows are extr
107a0 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51  acted from the Q
107b0 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62  ueue table one b
107c0 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20  y.** one.  Each 
107d0 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66 72  row extracted fr
107e0 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74 70  om Queue is outp
107f0 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  ut to pDest.  Th
10800 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a  en the single.**
10810 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20 28   extracted row (
10820 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72 72  now in the iCurr
10830 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d  ent table) becom
10840 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  es the content o
10850 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69  f the.** recursi
10860 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72  ve-table for a r
10870 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20 72  ecursive-query r
10880 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20  un.  The output 
10890 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
108a0 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64  -query.** is add
108b0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
108c0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
108d0 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20  hen another row 
108e0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
108f0 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74  m Queue.** and t
10900 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e  he iteration con
10910 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65  tinues until the
10920 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
10930 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
10940 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
10950 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ry operator is U
10960 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70  NION then no dup
10970 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65 20  licate rows are 
10980 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ever.** inserted
10990 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
109a0 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73  table.  The iDis
109b0 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70  tinct table keep
109c0 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20  s a copy of all 
109d0 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  rows.** that hav
109e0 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65  e ever been inse
109f0 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20  rted into Queue 
10a00 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c 69  and causes dupli
10a10 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64  cates to be.** d
10a20 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74 68  iscarded.  If th
10a30 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  e operator is UN
10a40 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75  ION ALL, then du
10a50 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c  plicates are all
10a60 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  owed..** .** If 
10a70 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61 6e  the query has an
10a80 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20   ORDER BY, then 
10a90 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 51  entries in the Q
10aa0 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b  ueue table are k
10ab0 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20  ept in.** ORDER 
10ac0 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65  BY order and the
10ad0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73 20   first entry is 
10ae0 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65 61  extracted for ea
10af0 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f  ch cycle.  Witho
10b00 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42  ut.** an ORDER B
10b10 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  Y, the Queue tab
10b20 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49 46  le is just a FIF
10b30 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49  O..**.** If a LI
10b40 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70 72  MIT clause is pr
10b50 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65  ovided, then the
10b60 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73   iteration stops
10b70 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77   after LIMIT row
10b80 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f  s.** have been o
10b90 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
10ba0 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f   A LIMIT of zero
10bb0 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
10bc0 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a   no rows and a.*
10bd0 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54  * negative LIMIT
10be0 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
10bf0 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74   all rows.  If t
10c00 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20  here is also an 
10c10 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a  OFFSET clause.**
10c20 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 65   with a positive
10c30 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
10c40 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75   first OFFSET ou
10c50 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61 72  tputs are discar
10c60 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68  ded rather.** th
10c70 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  an being sent to
10c80 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d   pDest.  The LIM
10c90 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f  IT count does no
10ca0 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66  t begin until af
10cb0 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f  ter OFFSET.** ro
10cc0 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ws have been ski
10cd0 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
10ce0 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69 74  void generateWit
10cf0 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
10d00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10d10 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
10d20 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10d30 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10d40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
10d50 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
10d60 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
10d70 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
10d80 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
10d90 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
10da0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
10db0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
10dc0 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20  ->pSrc;      /* 
10dd0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10de0 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
10df0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10e00 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
10e10 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d  ->nExpr;  /* Num
10e20 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10e30 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
10e40 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20  table */.  Vdbe 
10e50 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
10e60 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
10e70 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
10e80 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
10e90 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ction */.  Selec
10ea0 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70  t *pSetup = p->p
10eb0 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  Prior;   /* The 
10ec0 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20  setup query */. 
10ed0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ef0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10f00 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
10f10 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20  ont, addrBreak; 
10f20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45       /* CONTINUE
10f30 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65   and BREAK addre
10f40 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sses */.  int iC
10f50 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  urrent = 0;     
10f60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
10f70 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
10f80 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74    int regCurrent
10f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10fa0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
10fb0 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c  ing Current tabl
10fc0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75  e */.  int iQueu
10fd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10fe0 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75       /* The Queu
10ff0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
11000 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20   iDistinct = 0; 
11010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
11020 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72   ensure unique r
11030 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20  esults if UNION 
11040 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
11050 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20   SRT_Fifo;      
11060 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69     /* How to wri
11070 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20  te to Queue */. 
11080 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
11090 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f  Queue;         /
110a0 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61 72  * SelectDest tar
110b0 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65 75  getting the Queu
110c0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
110d0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
110e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
110f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11100 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11120 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11130 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
11140 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
11150 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
11160 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11170 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
11180 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  et;       /* Sav
11190 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  ed LIMIT and OFF
111a0 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  SET */.  int reg
111b0 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74  Limit, regOffset
111c0 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ;      /* Regist
111d0 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49  ers used by LIMI
111e0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
111f0 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
11200 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
11210 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
11220 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
11230 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
11240 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
11250 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
11260 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
11270 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49  Process the LIMI
11280 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
11290 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78  uses, if they ex
112a0 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65  ist */.  addrBre
112b0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
112c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
112d0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
112e0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
112f0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
11300 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
11310 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70  t;.  pOffset = p
11320 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67  ->pOffset;.  reg
11330 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
11340 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d  t;.  regOffset =
11350 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
11360 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f  ->pLimit = p->pO
11370 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ffset = 0;.  p->
11380 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
11390 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
113a0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
113b0 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
113c0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
113d0 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
113e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
113f0 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
11400 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
11410 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
11420 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  [i].fg.isRecursi
11430 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
11440 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
11450 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
11460 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11470 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
11480 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
11490 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
114a0 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
114b0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
114c0 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
114d0 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
114e0 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
114f0 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
11500 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
11510 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
11520 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
11530 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
11540 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
11550 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
11560 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
11570 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
11580 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
11590 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
115a0 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
115b0 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
115c0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
115d0 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
115e0 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
115f0 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
11600 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
11610 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
11620 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
11630 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
11640 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
11650 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
11660 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
11670 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
11680 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
11690 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
116a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
116b0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
116c0 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
116d0 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
116e0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
116f0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
11700 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
11710 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
11720 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
11730 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
11740 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11750 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
11760 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
11770 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
117a0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
117b0 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
117c0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
117d0 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
117e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
117f0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
11800 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
11810 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
11820 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
11830 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
11840 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
11850 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
11860 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
11870 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11880 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
11890 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
118a0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
118b0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
118c0 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
118d0 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
118e0 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
118f0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
11900 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
11910 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
11920 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
11930 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
11940 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
11950 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
11960 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  t = 0;.  rc = sq
11970 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
11980 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
11990 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
119a0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
119b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
119c0 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
119d0 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
119e0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
119f0 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
11a00 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
11a10 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
11a20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11a30 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
11a40 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
11a50 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
11a60 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
11a70 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
11a80 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
11a90 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
11aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11ab0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
11ac0 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
11ad0 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
11ae0 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
11af0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
11b00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11b10 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
11b20 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
11b30 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
11b40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11b60 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
11b70 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
11b80 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
11b90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11ba0 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
11bb0 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
11bc0 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
11bd0 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
11be0 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
11bf0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11c00 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
11c10 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
11c20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
11c30 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
11c40 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
11c50 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20  t, iCurrent,.   
11c60 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20     0, 0, pDest, 
11c70 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
11c80 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c  eak);.  if( regL
11c90 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
11ca0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11cb0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
11cc0 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72  , regLimit, addr
11cd0 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
11ce0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
11cf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
11d00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
11d10 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45  drCont);..  /* E
11d20 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72  xecute the recur
11d30 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69  sive SELECT taki
11d40 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ng the single ro
11d50 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a  w in Current as.
11d60 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66    ** the value f
11d70 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
11d80 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68  -table. Store th
11d90 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
11da0 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69   Queue..  */.  i
11db0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
11dc0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
11dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11de0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 65  rMsg(pParse, "re
11df0 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61 74  cursive aggregat
11e00 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75  e queries not su
11e10 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c  pported");.  }el
11e20 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  se{.    p->pPrio
11e30 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  r = 0;.    sqlit
11e40 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11e50 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
11e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
11e70 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
11e80 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
11e90 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b  tup;.  }..  /* K
11ea0 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  eep running the 
11eb0 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51  loop until the Q
11ec0 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f  ueue is empty */
11ed0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
11ee0 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  to(v, addrTop);.
11ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11f00 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
11f10 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66  rBreak);..end_of
11f20 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
11f30 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
11f40 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
11f50 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
11f60 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42  y);.  p->pOrderB
11f70 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11f80 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
11f90 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  it;.  p->pOffset
11fa0 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65   = pOffset;.  re
11fb0 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
11fc0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
11fd0 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  E */../* Forward
11fe0 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73   references */.s
11ff0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
12000 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
12010 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12020 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
12030 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
12040 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
12050 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
12060 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
12070 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
12080 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
12090 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
120a0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
120b0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
120c0 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65  /*.** Handle the
120d0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
120e0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65   a compound-sele
120f0 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  ct that originat
12100 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c  es from a.** VAL
12110 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20  UES clause.  By 
12120 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73  handling this as
12130 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c   a special case,
12140 20 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a   we avoid deep.*
12150 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64  * recursion, and
12160 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65   thus do not nee
12170 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65  d to enforce the
12180 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
12190 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a  MPOUND_SELECT.**
121a0 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61   on a VALUES cla
121b0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75  use..**.** Becau
121c0 73 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62  se the Select ob
121d0 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20  ject originates 
121e0 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c  from a VALUES cl
121f0 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 49  ause:.**   (1) I
12200 74 20 68 61 73 20 6e 6f 20 4c 49 4d 49 54 20 6f  t has no LIMIT o
12210 72 20 4f 46 46 53 45 54 0a 2a 2a 20 20 20 28 32  r OFFSET.**   (2
12220 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  ) All terms are 
12230 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28  UNION ALL.**   (
12240 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4f  3) There is no O
12250 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
12260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
12270 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a  tiSelectValues(.
12280 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12290 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
122a0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
122b0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
122c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
122d0 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
122e0 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
122f0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
12300 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
12310 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
12320 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
12330 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
12340 72 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20  r;.  int nRow = 
12350 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  1;.  int rc = 0;
12360 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
12370 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
12380 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a  iValue );.  do{.
12390 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
123a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
123b0 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ues );.    asser
123c0 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  t( p->op==TK_ALL
123d0 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   || (p->op==TK_S
123e0 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69  ELECT && p->pPri
123f0 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  or==0) );.    as
12400 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
12410 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
12420 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
12430 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12440 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d  ->pNext==0 || p-
12450 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
12460 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74  p->pNext->pEList
12470 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69  ->nExpr );.    i
12480 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
12490 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
124a0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e  ert( p->pPrior->
124b0 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20  pNext==p );.    
124c0 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  p = p->pPrior;. 
124d0 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68     nRow++;.  }wh
124e0 69 6c 65 28 31 29 3b 0a 20 20 77 68 69 6c 65 28  ile(1);.  while(
124f0 20 70 20 29 7b 0a 20 20 20 20 70 50 72 69 6f 72   p ){.    pPrior
12500 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
12510 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
12520 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12530 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
12540 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 70  p, pDest);.    p
12550 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
12560 72 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  r;.    if( rc ) 
12570 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53  break;.    p->nS
12580 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b  electRow = nRow;
12590 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
125a0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
125b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
125c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
125d0 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
125e0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
125f0 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
12600 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
12610 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
12620 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
12630 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
12640 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
12650 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
12660 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
12670 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
12680 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
12690 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
126a0 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
126b0 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
126c0 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
126d0 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
126e0 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
126f0 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
12700 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
12710 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
12720 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
12730 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
12740 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
12750 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
12760 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
12770 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
12780 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
12790 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
127a0 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
127b0 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
127c0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
127d0 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
127e0 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
127f0 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
12800 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
12810 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
12820 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
12830 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
12840 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
12850 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
12860 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
12870 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
12880 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12890 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
128a0 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
128b0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
128c0 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
128d0 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
128e0 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
128f0 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
12900 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
12910 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
12920 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
12930 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
12940 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
12950 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
12960 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
12970 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
12980 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
12990 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
129a0 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
129b0 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
129c0 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
129d0 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
129e0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
129f0 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
12a00 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
12a10 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
12a20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
12a30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12a40 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
12a50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
12a60 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
12a70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
12a80 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
12a90 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
12aa0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12ab0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
12ac0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
12ad0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
12ae0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12af0 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
12b00 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
12b10 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
12b20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
12b30 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
12b40 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
12b50 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
12b60 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
12b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
12b80 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12b90 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
12ba0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
12bb0 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
12bc0 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
12bd0 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
12be0 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
12bf0 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
12c00 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
12c10 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
12c20 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
12c30 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12c40 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
12c50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
12c60 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
12c70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  1 = 0;        /*
12c80 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
12c90 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
12ca0 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20  int iSub2 = 0;  
12cb0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
12cc0 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
12cd0 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
12ce0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
12cf0 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
12d00 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
12d10 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
12d20 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
12d30 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
12d40 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
12d50 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
12d60 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
12d70 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
12d80 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
12d90 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
12da0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
12db0 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
12dc0 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
12dd0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
12de0 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
12df0 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
12e00 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
12e10 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
12e20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
12e30 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
12e40 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
12e50 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
12e60 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
12e70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12e80 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
12e90 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
12ea0 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
12eb0 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
12ec0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
12ed0 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
12ee0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
12ef0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12f00 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
12f10 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
12f20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12f30 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
12f40 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
12f50 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
12f60 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
12f70 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
12f80 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
12f90 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
12fa0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
12fb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12fc0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
12fd0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
12fe0 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
12ff0 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
13000 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
13010 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
13020 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
13030 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
13040 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
13050 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
13060 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
13070 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
13080 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
13090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
130a0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
130b0 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
130c0 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
130d0 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
130e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
130f0 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
13100 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  D);.    dest.eDe
13110 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
13120 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
13130 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61  l handling for a
13140 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
13150 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
13160 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61   as a VALUES cla
13170 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
13180 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13190 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20  _MultiValue ){. 
131a0 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
131b0 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65  ectValues(pParse
131c0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
131d0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
131e0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
131f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
13200 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
13210 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
13220 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
13230 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
13240 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
13250 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
13260 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
13270 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
13280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
13290 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
132a0 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
132b0 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66  Expr );..#ifndef
132c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
132d0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
132e0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
132f0 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  e ){.    generat
13300 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
13310 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ery(pParse, p, &
13320 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  dest);.  }else.#
13330 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
13340 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
13350 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
13360 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
13370 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
13380 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13390 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
133a0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
133b0 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
133c0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
133d0 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  else..  /* Gener
133e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
133f0 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
13400 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13410 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
13420 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
13430 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
13440 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30      int addr = 0
13450 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
13460 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  it;.      assert
13470 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
13480 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  t );.      pPrio
13490 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  r->iLimit = p->i
134a0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
134b0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
134c0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
134d0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
134e0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
134f0 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
13500 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
13510 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
13520 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
13530 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
13540 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
13550 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13560 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
13570 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
13580 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
13590 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
135a0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
135b0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
135c0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
135d0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
135e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
135f0 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
13600 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
13610 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
13620 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
13630 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
13640 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
13650 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
13660 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13670 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c   OP_IfNot, p->iL
13680 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
13690 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
136a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
136b0 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
136c0 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
136d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
136e0 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  iOffset ){.     
136f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13700 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
13710 49 66 4e 6f 74 50 6f 73 2c 20 70 2d 3e 69 4f 66  IfNotPos, p->iOf
13720 66 73 65 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74  fset, p->iOffset
13730 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
13740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13750 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 70 2d 3e  3(v, OP_Add, p->
13760 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73  iLimit, p->iOffs
13770 65 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  et, p->iOffset+1
13780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13790 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
137a0 2c 20 4f 50 5f 53 65 74 49 66 4e 6f 74 50 6f 73  , OP_SetIfNotPos
137b0 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e  , p->iLimit, p->
137c0 69 4f 66 66 73 65 74 2b 31 2c 20 2d 31 29 3b 0a  iOffset+1, -1);.
137d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
137e0 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  }.      explainS
137f0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
13800 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
13810 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
13820 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
13830 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
13840 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
13850 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
13860 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
13870 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
13880 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
13890 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
138a0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
138b0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
138c0 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
138d0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20  pPrior->pLimit. 
138e0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
138f0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50  ExprIsInteger(pP
13900 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  rior->pLimit, &n
13910 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26  Limit).       &&
13920 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e   nLimit>0 && p->
13930 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75 36  nSelectRow > (u6
13940 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20  4)nLimit .      
13950 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
13960 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69  electRow = nLimi
13970 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
13980 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
13990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
139a0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
139b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
139c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
139d0 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
139e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
139f0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
13a00 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
13a10 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
13a20 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
13a30 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
13a40 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38  sult */.      u8
13a50 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   op = 0;       /
13a60 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
13a70 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
13a80 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
13a90 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
13aa0 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
13ab0 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
13ac0 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
13ad0 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
13ae0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
13af0 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  pOffset; /* Save
13b00 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
13b10 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
13b20 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  fset */.      in
13b30 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
13b40 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65  lectDest unionde
13b50 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63  st;..      testc
13b60 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45  ase( p->op==TK_E
13b70 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74  XCEPT );.      t
13b80 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
13b90 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
13ba0 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f    priorOp = SRT_
13bb0 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
13bc0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
13bd0 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
13be0 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
13bf0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
13c00 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
13c10 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
13c20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
13c30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13c40 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13c50 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20  Limit==0 );     
13c60 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
13c70 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
13c80 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
13c90 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
13ca0 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20  et==0 );     /* 
13cb0 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
13cc0 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
13cd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
13ce0 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50  nTab = dest.iSDP
13cf0 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
13d00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
13d10 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
13d20 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
13d30 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
13d40 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
13d50 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
13d60 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
13d70 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
13d80 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
13d90 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Tab++;.        a
13da0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
13db0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
13dc0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
13dd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13de0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
13df0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
13e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13e10 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
13e20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
13e30 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
13e40 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
13e50 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73      findRightmos
13e60 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  t(p)->selFlags |
13e70 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
13e80 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  al;.        asse
13e90 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
13ea0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
13eb0 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
13ec0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
13ed0 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
13ee0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
13ef0 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
13f00 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  By );.      sqli
13f10 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
13f20 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72  t(&uniondest, pr
13f30 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
13f40 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
13f50 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
13f60 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
13f70 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
13f80 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
13f90 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
13fa0 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
13fb0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
13fc0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
13fd0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13fe0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13ff0 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
14000 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14010 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
14020 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45   if( p->op==TK_E
14030 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20  XCEPT ){.       
14040 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
14050 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14060 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14070 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
14080 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  ;.        op = S
14090 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
140a0 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
140b0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
140c0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
140d0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
140e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
140f0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
14100 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
14110 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  et = 0;.      un
14120 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
14130 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  op;.      explai
14140 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14150 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
14160 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14180 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
14190 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
141a0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
141b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
141c0 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74     /* Query flat
141d0 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65  tening in sqlite
141e0 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20  3Select() might 
141f0 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72  refill p->pOrder
14200 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20  By..      ** Be 
14210 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70  sure to delete p
14220 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72  ->pOrderBy, ther
14230 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20  efore, to avoid 
14240 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a  a memory leak. *
14250 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
14260 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
14270 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
14280 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
14290 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
142a0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
142b0 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  ior;.      p->pO
142c0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
142d0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
142e0 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65  UNION ) p->nSele
142f0 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
14300 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
14310 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
14320 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
14330 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
14340 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
14350 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14360 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
14370 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->iLimit = 0;.
14380 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
14390 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
143a0 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
143b0 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
143c0 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
143d0 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
143e0 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
143f0 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
14400 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14410 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61   assert( unionTa
14420 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20  b==dest.iSDParm 
14430 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  || dest.eDest!=p
14440 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20  riorOp );.      
14450 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
14460 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
14470 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
14480 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
14490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
144a0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
144b0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
144c0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
144d0 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
144e0 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
144f0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
14500 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
14510 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
14520 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
14530 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
14540 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
14550 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
14560 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
14570 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
14580 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14590 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
145a0 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
145b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
145c0 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
145d0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
145e0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
145f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14600 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14610 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
14620 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  Tab, iBreak); Vd
14630 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14640 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
14650 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
14660 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
14670 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
14680 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
14690 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
146a0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
146b0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
146c0 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
146d0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
146e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
146f0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
14700 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14710 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14720 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
14730 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  b, iStart); Vdbe
14740 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14760 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14770 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
14780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14790 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
147a0 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
147b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
147c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
147d0 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d  ault: assert( p-
147e0 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43  >op==TK_INTERSEC
147f0 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74  T ); {.      int
14800 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
14810 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
14820 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
14830 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
14840 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  , *pOffset;.    
14850 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
14860 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74    SelectDest int
14870 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20  ersectdest;.    
14880 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20    int r1;..     
14890 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
148a0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
148b0 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
148c0 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
148d0 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
148e0 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
148f0 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
14900 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
14910 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
14920 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
14930 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
14940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
14950 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
14960 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
14970 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14980 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14990 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
149a0 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ;..      addr = 
149b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
149c0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
149d0 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b  meral, tab1, 0);
149e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
149f0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
14a00 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
14a10 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14a20 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
14a30 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
14a40 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
14a50 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
14a60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14a70 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  p->pEList );..  
14a80 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
14a90 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
14aa0 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
14ab0 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
14ac0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14ad0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
14ae0 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74  tInit(&intersect
14af0 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  dest, SRT_Union,
14b00 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78   tab1);.      ex
14b10 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
14b20 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
14b30 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
14b40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14b50 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14b60 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65  pPrior, &interse
14b70 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ctdest);.      i
14b80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14b90 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
14ba0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
14bb0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
14bc0 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
14bd0 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
14be0 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
14bf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
14c00 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14c10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
14c20 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c  Ephemeral, tab2,
14c30 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
14c40 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
14c50 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[1] == -1 );. 
14c60 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
14c70 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[1] = addr;.
14c80 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
14c90 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
14ca0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
14cb0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
14cc0 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
14cd0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
14ce0 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14cf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65   = 0;.      inte
14d00 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72  rsectdest.iSDPar
14d10 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20  m = tab2;.      
14d20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14d30 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
14d40 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14d50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14d60 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14d70 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64  , p, &intersectd
14d80 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
14d90 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14da0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
14db0 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
14dc0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
14dd0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
14de0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
14df0 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  Row>pPrior->nSel
14e00 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
14e10 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
14e20 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
14e30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
14e40 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
14e50 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
14e60 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
14e70 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14e80 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20  = pOffset;..    
14e90 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
14ea0 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
14eb0 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
14ec0 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
14ed0 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
14ee0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14ef0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14f00 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
14f10 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
14f20 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
14f30 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
14f40 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68   = p;.        wh
14f50 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
14f60 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
14f70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
14f80 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
14f90 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
14fa0 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
14fb0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
14fc0 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
14fd0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
14fe0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
14ff0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
15000 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15010 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
15020 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
15030 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
15040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15050 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
15060 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
15070 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15080 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  v);.      r1 = s
15090 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
150a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
150b0 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
150c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
150d0 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72  _RowKey, tab1, r
150e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
150f0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
15100 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
15110 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20  ab2, iCont, r1, 
15120 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
15130 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15140 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15150 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
15160 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15170 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
15180 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a  ->pEList, tab1,.
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
151b0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
151c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
151d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
151e0 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
151f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15200 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15210 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56  tab1, iStart); V
15220 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15230 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15240 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15250 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
15260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15270 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
15280 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
15290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
152a0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
152b0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
152c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
152d0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
152e0 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
152f0 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
15300 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a  p->op!=TK_ALL);.
15310 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
15320 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
15330 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
15340 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
15350 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
15360 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
15370 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
15380 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
15390 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
153a0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
153b0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
153c0 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
153d0 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
153e0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
153f0 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
15400 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15410 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
15420 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
15430 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
15440 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
15450 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
15460 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
15470 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
15480 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
15490 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
154a0 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
154b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
154c0 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
154d0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
154e0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15500 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
15510 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
15520 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
15530 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
15540 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
15550 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
15560 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
15570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15580 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
15590 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
155a0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
155b0 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
155c0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
155d0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
155e0 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
155f0 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
15600 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15620 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
15630 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
15640 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
15650 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  p->pNext==0 );. 
15660 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
15670 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
15680 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
15690 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
156a0 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  b, nCol, 1);.   
156b0 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
156c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
156d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
156e0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
156f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
15700 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
15710 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
15720 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
15730 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
15740 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
15750 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
15760 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
15770 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
15780 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
15790 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
157a0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
157b0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
157c0 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
157d0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
157e0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
157f0 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
15800 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
15810 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
15820 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
15830 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
15840 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
15850 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
15860 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
15870 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
15880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
15890 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
158a0 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
158b0 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
158c0 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
158d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
158e0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
158f0 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
15900 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
15920 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
15930 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
15940 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15950 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
15960 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73  , addr, (char*)s
15970 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
15980 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20  (pKeyInfo),.    
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
159b0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
159c0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
159d0 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
159e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
159f0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
15a00 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
15a10 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15a20 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74  :.  pDest->iSdst
15a30 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
15a40 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
15a50 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71  dest.nSdst;.  sq
15a60 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
15a70 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
15a80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
15a90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15aa0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
15ab0 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  LECT */../*.** E
15ac0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
15ad0 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72   when two or mor
15ae0 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d  e terms of a com
15af0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76  pound select hav
15b00 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73  e different.** s
15b10 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e  ize result sets.
15b20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15b30 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  SelectWrongNumTe
15b40 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a  rmsError(Parse *
15b50 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
15b60 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  p){.  if( p->sel
15b70 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
15b80 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
15b90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15ba0 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
15bb0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
15bc0 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
15bd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15be0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15bf0 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
15c00 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
15c10 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
15c20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
15c30 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
15c40 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
15c50 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
15c60 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
15c70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
15c80 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
15c90 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
15ca0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
15cb0 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
15cc0 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
15cd0 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
15ce0 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
15cf0 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
15d00 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
15d10 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
15d20 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
15d30 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
15d40 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
15d50 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
15d60 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
15d70 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
15d80 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
15d90 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
15da0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
15db0 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
15dc0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
15dd0 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
15de0 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
15df0 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
15e00 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
15e10 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
15e20 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
15e30 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
15e40 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
15e50 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
15e60 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
15e70 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
15e80 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
15e90 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
15ea0 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
15eb0 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
15ec0 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
15ed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
15ee0 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
15ef0 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
15f00 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
15f10 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
15f20 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
15f30 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
15f40 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
15f50 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15f60 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
15f70 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
15f80 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
15f90 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
15fa0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
15fb0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
15fc0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
15fd0 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
15fe0 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
15ff0 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
16000 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
16010 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
16020 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
16030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16040 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
16050 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
16060 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
16070 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
16080 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
16090 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
160a0 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
160b0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
160c0 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
160d0 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
160e0 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
160f0 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
16100 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
16110 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
16120 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
16130 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
16140 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
16150 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
16160 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
16170 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16180 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
16190 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
161a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
161b0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
161c0 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
161d0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
161e0 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
161f0 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
16200 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  ){.    int j1, j
16210 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  2;.    j1 = sqli
16220 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16230 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
16240 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ev); VdbeCoverag
16250 65 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  e(v);.    j2 = s
16260 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16270 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
16280 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
16290 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
162a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
162d0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
162e0 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
162f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16300 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
16310 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
16320 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64 62 65  nue, j2+2); Vdbe
16330 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16340 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16350 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
16360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16370 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
16380 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
16390 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
163a0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
163b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
163c0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
163d0 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
163e0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
163f0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
16400 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
16410 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
16420 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
16430 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
16440 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
16450 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
16460 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
16470 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72  tinue);..  asser
16480 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  t( pDest->eDest!
16490 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20  =SRT_Exists );. 
164a0 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
164b0 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65  eDest!=SRT_Table
164c0 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44   );.  switch( pD
164d0 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
164e0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
164f0 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
16500 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
16510 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
16520 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
16530 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
16540 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16550 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16560 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
16570 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16580 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
16590 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
165a0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
165b0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
165c0 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20  >nSdst, r1);.   
165d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
165e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
165f0 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  wid, pDest->iSDP
16600 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
16610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16620 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
16630 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
16640 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
16650 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16660 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
16670 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
16680 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16690 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
166a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
166b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
166c0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
166d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
166e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
166f0 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
16700 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
16710 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
16720 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
16730 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
16740 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
16750 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
16760 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
16770 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
16780 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
16790 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
167a0 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
167b0 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
167c0 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
167d0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
167e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
167f0 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50  ->nSdst==1 || pP
16800 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a  arse->nErr>0 );.
16810 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
16820 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20  Sdst = .        
16830 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
16840 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
16850 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
16860 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
16870 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
16880 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16890 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
168a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
168b0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
168c0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72  pIn->iSdst, 1, r
168d0 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
168e0 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  st,1);.      sql
168f0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
16900 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
16910 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
16920 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16930 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16940 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
16950 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29  st->iSDParm, r1)
16960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16970 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16980 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
16990 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
169a0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
169b0 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
169c0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
169d0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
169e0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
169f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
16a00 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
16a10 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
16a20 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
16a30 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
16a40 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
16a50 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
16a60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
16a70 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50  ->nSdst==1 || pP
16a80 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20  arse->nErr>0 ); 
16a90 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
16aa0 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20  nSdst!=1 );.    
16ab0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16ac0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16ad0 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
16ae0 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20  >iSDParm, 1);.  
16af0 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
16b00 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
16b10 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
16b20 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
16b30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16b40 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
16b50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16b60 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
16b70 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
16b80 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
16b90 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
16ba0 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
16bb0 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64  ng at pDest->iSd
16bc0 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  st.  Then the co
16bd0 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e  -routine yields.
16be0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16bf0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
16c00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  {.      if( pDes
16c10 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
16c20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53         pDest->iS
16c30 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dst = sqlite3Get
16c40 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
16c50 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
16c60 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53         pDest->nS
16c70 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74  dst = pIn->nSdst
16c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16c90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
16ca0 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
16cb0 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
16cc0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
16cd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16ce0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16cf0 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
16d00 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62  SDParm);.      b
16d10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
16d20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
16d30 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  he above, then t
16d40 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e  he result destin
16d50 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20  ation must be.  
16d60 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e    ** SRT_Output.
16d70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
16d80 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  s never called w
16d90 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20  ith any other.  
16da0 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e    ** destination
16db0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
16dc0 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f  ones handled abo
16dd0 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  ve or SRT_Output
16de0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16df0 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20  For SRT_Output, 
16e00 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
16e10 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
16e20 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20   of registers.  
16e30 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  .    ** Then the
16e40 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70   OP_ResultRow op
16e50 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
16e60 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74  cause sqlite3_st
16e70 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72  ep() to.    ** r
16e80 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72  eturn the next r
16e90 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20  ow of result..  
16ea0 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
16eb0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
16ec0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
16ed0 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
16ee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16ef0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
16f00 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73  ltRow, pIn->iSds
16f10 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
16f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16f30 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
16f40 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
16f50 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
16f60 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
16f70 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
16f80 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
16f90 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
16fa0 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
16fb0 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
16fc0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
16fd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16fe0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
16ff0 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
17000 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
17010 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17020 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
17030 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
17040 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
17050 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17060 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
17070 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
17080 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17090 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
170a0 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
170b0 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
170c0 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
170d0 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
170e0 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
170f0 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
17100 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
17110 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
17120 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
17130 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17140 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
17150 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
17160 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
17170 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
17180 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
17190 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
171a0 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
171b0 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
171c0 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
171d0 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
171e0 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
171f0 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
17200 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
17210 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
17220 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
17230 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
17240 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
17250 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
17260 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
17270 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
17280 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
17290 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
172a0 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
172b0 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
172c0 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
172d0 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
172e0 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
172f0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17300 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
17310 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
17320 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
17330 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
17340 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
17350 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
17360 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
17370 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
17380 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
17390 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
173a0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
173b0 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
173c0 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
173d0 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
173e0 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
173f0 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
17400 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
17410 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
17420 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
17430 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
17440 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
17450 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
17460 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
17470 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
17480 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
17490 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
174a0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
174b0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
174c0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
174d0 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
174e0 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
174f0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
17500 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
17510 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
17520 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
17530 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
17540 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
17550 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
17560 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
17570 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
17580 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
17590 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
175a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
175b0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
175c0 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
175d0 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
175e0 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
175f0 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
17600 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
17610 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
17620 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
17630 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
17640 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
17650 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
17660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
17670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17680 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17690 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
176a0 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
176b0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
176c0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
176d0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
176e0 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
176f0 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
17700 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
17710 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
17720 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
17730 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
17740 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
17750 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
17760 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
17770 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
17780 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
17790 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
177a0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
177b0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
177c0 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
177d0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
177e0 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
177f0 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
17800 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
17810 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
17820 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
17830 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
17840 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
17850 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
17860 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
17870 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
17880 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
17890 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
178a0 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
178b0 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
178c0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
178d0 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
178e0 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
178f0 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
17900 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
17910 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
17920 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
17930 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
17940 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
17950 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
17960 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
17970 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
17980 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
17990 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
179a0 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
179b0 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
179c0 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
179d0 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
179e0 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
179f0 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
17a00 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
17a10 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
17a20 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
17a30 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
17a40 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
17a50 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
17a60 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
17a70 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
17a80 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
17a90 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
17aa0 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
17ab0 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
17ac0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
17ad0 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
17ae0 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
17af0 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
17b00 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
17b10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
17b20 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
17b30 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
17b40 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
17b50 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
17b60 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
17b70 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
17b80 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
17b90 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
17ba0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
17bb0 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
17bc0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
17bd0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
17be0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
17bf0 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
17c00 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
17c10 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
17c20 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
17c30 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
17c40 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
17c50 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
17c60 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
17c70 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
17c80 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
17c90 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
17ca0 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
17cb0 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
17cc0 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
17cd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
17ce0 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
17cf0 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
17d00 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
17d10 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
17d20 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
17d30 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
17d40 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
17d50 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
17d60 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
17d70 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
17d80 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
17d90 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
17da0 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
17db0 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
17dc0 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
17dd0 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
17de0 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
17df0 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
17e00 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
17e10 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
17e20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17e30 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
17e40 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
17e50 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
17e60 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
17e70 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
17e80 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
17e90 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
17ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17eb0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
17ec0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
17ed0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
17ee0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
17ef0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
17f00 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
17f10 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17f30 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
17f40 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
17f50 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
17f60 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
17f70 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
17f80 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17fa0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17fb0 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
17fc0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
17fd0 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
17fe0 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
17ff0 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
18000 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
18010 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
18020 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
18030 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
18040 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
18050 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
18060 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
18070 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
18080 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
18090 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
180a0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
180b0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
180c0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
180d0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
180e0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
180f0 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
18100 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
18110 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
18120 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
18130 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
18140 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
18150 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18160 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
18170 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
18180 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18190 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
181a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
181b0 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
181c0 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
181d0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
181e0 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
181f0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
18200 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
18210 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18220 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
18230 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18240 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
18250 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18260 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
18270 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18280 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
18290 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
182a0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
182b0 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
182c0 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
182d0 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
182e0 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
182f0 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
18300 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18310 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
18320 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
18330 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
18340 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
18350 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
18360 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
18370 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
18380 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18390 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
183a0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
183b0 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
183c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
183d0 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
183e0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
183f0 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
18400 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
18410 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
18420 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
18430 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
18440 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
18450 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
18460 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
18470 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
18480 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
18490 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
184a0 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
184b0 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
184c0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
184d0 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
184e0 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
184f0 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
18500 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
18510 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
18520 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
18530 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
18540 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
18550 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
18560 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
18570 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
18580 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
18590 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
185a0 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
185b0 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
185c0 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
185d0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
185e0 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
185f0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
18600 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
18610 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
18620 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
18630 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
18640 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
18650 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
18660 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
18670 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
18680 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
18690 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
186a0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
186b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
186c0 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
186d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
186e0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
186f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
18700 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
18710 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
18720 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18730 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
18740 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
18750 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
18760 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
18770 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
18780 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
18790 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
187a0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
187b0 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
187c0 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
187d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
187e0 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
187f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18800 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
18810 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
18820 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
18830 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
18840 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
18850 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
18860 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
18870 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
18880 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
18890 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
188a0 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
188b0 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
188c0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
188d0 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
188e0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
188f0 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
18900 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
18910 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
18920 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
18930 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
18940 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18950 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
18960 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
18970 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
18980 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
18990 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
189a0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
189b0 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
189c0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
189d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
189e0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
189f0 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
18a00 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
18a10 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
18a20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
18a30 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
18a40 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
18a50 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
18a60 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
18a70 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
18a80 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
18a90 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
18aa0 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
18ab0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
18ac0 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
18ad0 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
18ae0 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
18af0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
18b00 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
18b10 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
18b20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
18b30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
18b40 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
18b50 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
18b60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
18b70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
18b80 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
18b90 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
18ba0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
18bb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18bc0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18bd0 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
18be0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
18bf0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  x.iOrderByCol==i
18c00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
18c10 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
18c20 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
18c30 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
18c40 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
18c50 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
18c60 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
18c70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
18c80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
18c90 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
18ca0 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
18cb0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
18cc0 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20  Value = i;.     
18cd0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71     pOrderBy = sq
18ce0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
18cf0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
18d00 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20  erBy, pNew);.   
18d10 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
18d20 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  y ) pOrderBy->a[
18d30 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e  nOrderBy++].u.x.
18d40 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
18d50 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  16)i;.      }.  
18d60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
18d70 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72  mpute the compar
18d80 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e  ison permutation
18d90 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61   and keyinfo tha
18da0 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20  t is used with. 
18db0 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74   ** the permutat
18dc0 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  ion used to dete
18dd0 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78  rmine if the nex
18de0 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65  t.  ** row of re
18df0 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d  sults comes from
18e00 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65   selectA or sele
18e10 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65  ctB.  Also add e
18e20 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c  xplicit.  ** col
18e30 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f  lations to the O
18e40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
18e50 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65  erms so that whe
18e60 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
18e70 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67  .  ** to the rig
18e80 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20  ht and the left 
18e90 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74  are evaluated, t
18ea0 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72  hey use the corr
18eb0 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  ect.  ** collati
18ec0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d  on..  */.  aPerm
18ed0 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ute = sqlite3DbM
18ee0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
18ef0 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42  eof(int)*nOrderB
18f00 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  y);.  if( aPermu
18f10 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
18f20 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18f30 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69  pItem;.    for(i
18f40 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
18f50 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42  By->a; i<nOrderB
18f60 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
18f70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18f80 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18f90 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
18fa0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
18fb0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
18fc0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
18fd0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
18fe0 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
18ff0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19000 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
19010 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74  pKeyMerge = mult
19020 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
19030 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
19040 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
19050 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
19060 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
19070 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
19080 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
19090 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
190a0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
190b0 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
190c0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
190d0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
190e0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
190f0 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
19100 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
19110 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
19120 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
19130 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
19140 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
19150 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
19160 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
19170 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
19180 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
19190 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
191a0 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
191b0 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
191c0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
191d0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
191e0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
191f0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
19200 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
19210 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
19220 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
19230 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19240 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
19250 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
19260 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
19270 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
19280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19290 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
192a0 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
192b0 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
192c0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
192d0 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
192e0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
192f0 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
19300 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
19310 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
19320 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
19330 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
19340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
19350 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
19360 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
19370 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
19380 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
19390 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
193a0 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
193b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
193c0 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
193d0 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
193e0 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
193f0 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
19400 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
19410 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
19420 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
19430 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
19440 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
19450 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
19460 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
19470 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
19480 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
19490 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
194a0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
194b0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
194c0 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
194d0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
194e0 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
194f0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
19500 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
19510 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
19520 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
19530 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
19540 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
19550 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19560 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
19570 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19580 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19590 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
195a0 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
195b0 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
195c0 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
195f0 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
19600 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19610 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
19620 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
19630 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
19640 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
19650 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
19660 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
19670 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
19680 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
19690 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
196a0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
196b0 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
196c0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
196d0 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
196e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
196f0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
19700 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
19710 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19720 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
19730 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
19740 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
19750 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
19760 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
19770 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
19780 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
19790 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
197a0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
197b0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
197c0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
197d0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
197e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
197f0 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
19800 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
19810 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
19820 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
19830 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
19840 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19850 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a  Addr(v) + 1;.  j
19860 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
19870 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
19880 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19890 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drA, 0, addrSele
198a0 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctA);.  VdbeComm
198b0 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45  ent((v, "left SE
198c0 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
198d0 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
198e0 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e  imitA;.  explain
198f0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
19900 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
19910 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
19920 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
19930 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
19940 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19950 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
19960 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19970 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
19980 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
19990 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  1);..  /* Genera
199a0 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
199b0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
199c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
199d0 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
199e0 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
199f0 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
19a00 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
19a10 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19a20 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73  v) + 1;.  j1 = s
19a30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19a40 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
19a50 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20  tine, regAddrB, 
19a60 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  0, addrSelectB);
19a70 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
19a80 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54  v, "right SELECT
19a90 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
19aa0 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
19ab0 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
19ac0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
19ad0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
19ae0 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
19af0 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69   = 0;  .  explai
19b00 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
19b10 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
19b20 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
19b30 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
19b40 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20  e, p, &destB);. 
19b50 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76   p->iLimit = sav
19b60 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f  edLimit;.  p->iO
19b70 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66  ffset = savedOff
19b80 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  set;.  sqlite3Vd
19b90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
19ba0 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  ndCoroutine, reg
19bb0 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
19bc0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19bd0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
19be0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
19bf0 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
19c00 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
19c10 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
19c20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
19c30 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
19c40 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
19c50 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
19c60 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
19c70 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
19c80 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
19c90 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
19ca0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
19cb0 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
19cc0 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
19cd0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
19ce0 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
19cf0 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
19d00 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
19d10 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
19d20 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
19d30 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
19d40 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
19d50 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
19d60 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
19d70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
19d80 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
19d90 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
19da0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19db0 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
19dc0 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
19dd0 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
19de0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
19df0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
19e10 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
19e20 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
19e30 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
19e40 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
19e50 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  End);.  }.  sqli
19e60 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
19e70 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20  pKeyDup);..  /* 
19e80 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19e90 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
19ea0 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
19eb0 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
19ec0 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
19ed0 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
19ee0 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
19ef0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
19f00 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
19f10 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
19f20 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  {.    addrEofA_n
19f30 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20  oB = addrEofA = 
19f40 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73  labelEnd;.  }els
19f50 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
19f60 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
19f70 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
19f80 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  );.    addrEofA 
19f90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19fa0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
19fb0 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
19fc0 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  tB);.    addrEof
19fd0 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56  A_noB = sqlite3V
19fe0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19ff0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1a000 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a050 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1a060 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
1a070 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
1a080 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
1a090 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a0a0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1a0b0 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1a0c0 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1a0d0 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
1a0e0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1a0f0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
1a100 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1a110 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1a120 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1a130 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
1a140 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
1a150 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
1a160 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
1a170 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
1a180 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1a190 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1a1a0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1a1b0 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
1a1c0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1a1d0 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
1a1e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a1f0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1a200 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
1a210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a220 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a230 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45  regAddrA, labelE
1a240 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
1a250 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1a260 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1a270 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
1a280 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a290 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1a2a0 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
1a2b0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1a2c0 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
1a2d0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1a2e0 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
1a2f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a300 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
1a310 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
1a320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a330 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a340 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1a350 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a360 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a370 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1a380 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
1a390 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1a3a0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
1a3b0 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
1a3c0 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1a3d0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1a3e0 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
1a3f0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1a400 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
1a410 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1a420 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
1a430 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
1a440 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a450 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
1a460 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
1a470 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
1a480 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a490 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a4a0 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1a4b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a4c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1a4d0 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1a4e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1a4f0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1a500 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1a510 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
1a520 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1a530 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
1a540 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
1a550 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1a560 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
1a570 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1a580 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1a590 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a5a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1a5b0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1a5c0 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
1a5d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a5e0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a5f0 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1a600 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a610 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a620 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1a630 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
1a640 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
1a650 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
1a660 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
1a670 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1a680 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c  re(v, j1);.  sql
1a690 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a6a0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a6b0 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e  ddrA, addrEofA_n
1a6c0 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  oB); VdbeCoverag
1a6d0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1a6e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a6f0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1a700 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1a710 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1a720 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
1a730 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
1a740 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1a750 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a760 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
1a770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a780 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61  p4(v, OP_Permuta
1a790 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28  tion, 0, 0, 0, (
1a7a0 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20  char*)aPermute, 
1a7b0 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
1a7c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a7d0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
1a7e0 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65   destA.iSdst, de
1a7f0 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65  stB.iSdst, nOrde
1a800 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1a820 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20  har*)pKeyMerge, 
1a830 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
1a840 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1a850 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52  P5(v, OPFLAG_PER
1a860 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  MUTE);.  sqlite3
1a870 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1a880 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
1a890 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
1a8a0 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  gtB); VdbeCovera
1a8b0 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  ge(v);..  /* Jum
1a8c0 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f  p to the this po
1a8d0 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
1a8e0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75  terminate the qu
1a8f0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ery..  */.  sqli
1a900 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a910 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29  bel(v, labelEnd)
1a920 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1a930 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
1a940 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
1a950 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
1a960 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
1a970 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
1a980 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  st = pPrior;.   
1a990 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
1a9a0 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
1a9b0 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
1a9c0 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  ;.    generateCo
1a9d0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
1a9e0 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
1a9f0 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
1aa00 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63  Reassembly the c
1aa10 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f  ompound query so
1aa20 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
1aa30 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79   freed correctly
1aa40 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  .  ** by the cal
1aa50 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
1aa60 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
1aa70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
1aa80 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1aa90 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  p->pPrior);.  }.
1aaa0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1aab0 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  rior;.  pPrior->
1aac0 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a  pNext = p;..  /*
1aad0 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20  ** TBD:  Insert 
1aae0 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  subroutine calls
1aaf0 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72   to close cursor
1ab00 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a  s on incomplete.
1ab10 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65    **** subquerie
1ab20 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69  s ****/.  explai
1ab30 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
1ab40 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
1ab50 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65   iSub2, 0);.  re
1ab60 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
1ab70 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  r!=0;.}.#endif..
1ab80 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1ab90 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1aba0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1abb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1abc0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c  ./* Forward Decl
1abd0 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  arations */.stat
1abe0 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
1abf0 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20  rList(sqlite3*, 
1ac00 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
1ac10 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
1ac20 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
1ac30 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65  ect(sqlite3*, Se
1ac40 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
1ac50 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  rList *);../*.**
1ac60 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
1ac70 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1ac80 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
1ac90 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
1aca0 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
1acb0 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
1acc0 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
1acd0 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
1ace0 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
1acf0 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
1ad00 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1ad10 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
1ad20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
1ad30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1ad40 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
1ad50 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
1ad60 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
1ad70 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
1ad80 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
1ad90 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
1ada0 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
1adb0 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
1adc0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1add0 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
1ade0 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
1adf0 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
1ae00 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
1ae10 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
1ae20 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
1ae30 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
1ae40 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
1ae50 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
1ae60 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
1ae70 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
1ae80 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1ae90 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
1aea0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1aeb0 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
1aec0 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
1aed0 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
1aee0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65  db,        /* Re
1aef0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
1af00 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65  rs to this conne
1af10 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
1af20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
1af30 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
1af40 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
1af50 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  urs */.  int iTa
1af60 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ble,         /* 
1af70 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
1af80 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
1af90 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
1afa0 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65   /* Substitute e
1afb0 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b  xpressions */.){
1afc0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1afd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1afe0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1aff0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
1b000 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
1b010 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
1b020 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
1b030 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1b040 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
1b050 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
1b060 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
1b070 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
1b080 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
1b090 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
1b0a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b0b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
1b0c0 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
1b0d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
1b0e0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
1b0f0 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
1b100 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1b110 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
1b120 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1b130 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
1b140 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
1b150 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ew;.    }.  }els
1b160 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  e{.    pExpr->pL
1b170 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  eft = substExpr(
1b180 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
1b190 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b1a0 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  );.    pExpr->pR
1b1b0 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72  ight = substExpr
1b1c0 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  (db, pExpr->pRig
1b1d0 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
1b1e0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  st);.    if( Exp
1b1f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1b200 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1b210 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
1b220 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72  Select(db, pExpr
1b230 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61  ->x.pSelect, iTa
1b240 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1b260 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b270 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
1b280 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b2a0 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
1b2b0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1b2c0 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74  xprList(.  sqlit
1b2d0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1b2e0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1b2f0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
1b300 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1b310 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74  t,     /* List t
1b320 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68  o scan and in wh
1b330 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1b340 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74  titutes */.  int
1b350 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1b360 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
1b370 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
1b380 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1b390 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
1b3a0 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
1b3b0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1b3c0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1b3d0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1b3e0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1b3f0 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ++){.    pList->
1b400 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62  a[i].pExpr = sub
1b410 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74  stExpr(db, pList
1b420 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
1b430 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b440 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
1b450 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20   substSelect(.  
1b460 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1b470 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
1b480 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
1b490 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
1b4a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
1b4b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1b4c0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1b4d0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
1b4e0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1b4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1b500 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  e to be replaced
1b510 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1b520 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
1b530 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
1b540 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
1b550 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  *pSrc;.  struct 
1b560 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1b570 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
1b580 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
1b590 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
1b5a0 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
1b5b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b5c0 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
1b5d0 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
1b5e0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b5f0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
1b600 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
1b610 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
1b620 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e  st);.  p->pHavin
1b630 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1b640 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
1b650 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b660 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62   p->pWhere = sub
1b670 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
1b680 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
1b690 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
1b6a0 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
1b6b0 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
1b6c0 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  st);.  pSrc = p-
1b6d0 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1b6e0 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65   pSrc );  /* Eve
1b6f0 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29  n for (SELECT 1)
1b700 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d   we have: pSrc!=
1b710 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63  0 but pSrc->nSrc
1b720 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ==0 */.  if( ALW
1b730 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20  AYS(pSrc) ){.   
1b740 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1b750 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
1b760 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
1b770 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
1b780 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65  tSelect(db, pIte
1b790 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  m->pSelect, iTab
1b7a0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b7b0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20   }.  }.}.#endif 
1b7c0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
1b7d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1b7e0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1b7f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1b800 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
1b810 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1b820 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1b830 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1b840 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
1b850 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1b860 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
1b870 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66  ueries as a perf
1b880 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
1b890 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
1b8a0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20  utine returns 1 
1b8b0 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
1b8c0 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
1b8d0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72  flattening occur
1b8e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
1b8f0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
1b900 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
1b910 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
1b920 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
1b930 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
1b940 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
1b950 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1b960 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
1b970 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
1b980 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
1b990 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
1b9a0 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
1b9b0 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
1b9c0 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
1b9d0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1b9e0 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
1b9f0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
1ba00 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
1ba10 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
1ba20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1ba30 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
1ba40 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
1ba50 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
1ba60 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
1ba70 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
1ba80 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
1ba90 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
1baa0 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
1bab0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
1bac0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
1bad0 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
1bae0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
1baf0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
1bb00 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
1bb10 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
1bb20 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
1bb30 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
1bb40 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1bb50 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
1bb60 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
1bb70 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
1bb80 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
1bb90 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69  or this simplifi
1bba0 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
1bbb0 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
1bbc0 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
1bbd0 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
1bbe0 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
1bbf0 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
1bc00 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
1bc10 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
1bc20 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
1bc30 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
1bc40 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
1bc50 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
1bc60 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
1bc70 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1bc80 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1bc90 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
1bca0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1bcb0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1bcc0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
1bcd0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1bce0 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
1bcf0 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1bd00 67 72 65 67 61 74 65 20 6f 72 20 28 32 61 29 20  gregate or (2a) 
1bd10 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1bd20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a  is not a join.**
1bd30 20 20 20 20 20 20 20 20 61 6e 64 20 28 32 62 29          and (2b)
1bd40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1bd50 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 75   does not use su
1bd60 62 71 75 65 72 69 65 73 20 6f 74 68 65 72 20 74  bqueries other t
1bd70 68 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a 20 20  han the one.**  
1bd80 20 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61 75 73        FROM-claus
1bd90 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  e subquery that 
1bda0 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
1bdb0 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  or flattening.  
1bdc0 28 32 62 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  (2b is.**       
1bdd0 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20 5b   due to ticket [
1bde0 32 66 37 31 37 30 64 37 33 62 66 39 61 62 66 38  2f7170d73bf9abf8
1bdf0 30 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d  0] from 2015-02-
1be00 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  09.).**.**   (3)
1be10 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1be20 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
1be30 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1be40 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
1be50 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
1be60 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
1be70 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79   Strengthened by
1be80 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
1be90 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1bea0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1beb0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1bec0 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1bed0 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1bee0 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1bef0 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1bf00 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1bf10 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1bf20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1bf30 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1bf40 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1bf50 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1bf60 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1bf70 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1bf80 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1bf90 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1bfa0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
1bfb0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1bfc0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1bfd0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1bfe0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1bff0 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1c000 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
1c010 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1c020 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1c030 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1c040 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1c050 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1c060 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1c070 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1c080 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  ose with the spe
1c090 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1c0a0 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1c0b0 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1c0c0 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1c0d0 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1c0e0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1c0f0 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1c100 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c110 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1c120 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c130 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1c140 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
1c150 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c160 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1c170 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1c180 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
1c190 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
1c1a0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  tes..**.**  (**)
1c1b0 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1c1c0 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1c1d0 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1c1e0 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1c1f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1c200 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1c210 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1c220 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1c230 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1c240 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22  *        text: "
1c250 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c260 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1c270 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1c280 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20  r query .**     
1c290 20 20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20     does not use 
1c2a0 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28  LIMIT.".**.**  (
1c2b0 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1c2c0 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1c2d0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1c2e0 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1c2f0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1c300 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1c310 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1c320 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1c330 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1c340 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1c350 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1c360 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1c370 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1c380 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1c390 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1c3a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
1c3b0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
1c3c0 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
1c3d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1c3e0 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
1c3f0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1c400 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1c410 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
1c420 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1c430 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
1c440 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
1c450 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
1c460 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
1c470 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
1c480 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20  2339 and ticket 
1c490 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a  [02a8e81d44])..*
1c4a0 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
1c4b0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c4c0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1c4d0 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
1c4e0 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
1c4f0 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
1c500 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
1c510 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
1c520 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
1c530 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
1c540 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
1c550 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
1c560 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
1c570 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
1c580 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
1c590 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1c5a0 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
1c5b0 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
1c5c0 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
1c5d0 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
1c5e0 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
1c5f0 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
1c600 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
1c610 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
1c620 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1c630 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
1c640 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1c650 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
1c660 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
1c670 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
1c680 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
1c690 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1c6a0 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a  not a join.**.**
1c6b0 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
1c6c0 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
1c6d0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
1c6e0 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
1c6f0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
1c700 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
1c710 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
1c720 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
1c730 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
1c740 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
1c750 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1c760 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1c770 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
1c780 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1c790 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
1c7a0 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
1c7b0 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
1c7c0 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
1c7d0 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
1c7e0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
1c7f0 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
1c800 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
1c810 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
1c820 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
1c830 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
1c840 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
1c850 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
1c860 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
1c870 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
1c880 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
1c890 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
1c8a0 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
1c8b0 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
1c8c0 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1c8d0 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
1c8e0 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
1c8f0 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
1c900 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
1c910 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
1c920 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
1c930 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
1c940 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
1c950 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
1c960 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
1c970 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
1c980 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
1c990 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
1c9a0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1c9b0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1c9c0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
1c9d0 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
1c9e0 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
1c9f0 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  by clause of the
1ca00 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
1ca10 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
1ca20 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
1ca30 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
1ca40 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
1ca50 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75   (19)  The subqu
1ca60 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1ca70 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1ca80 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1ca90 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
1caa0 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
1cab0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
1cac0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1cad0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1cae0 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
1caf0 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
1cb00 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
1cb10 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
1cb20 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
1cb30 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
1cb40 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
1cb50 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
1cb60 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
1cb70 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1cb80 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
1cb90 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
1cba0 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
1cbb0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
1cbc0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cbd0 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20  .  But we.**    
1cbe0 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
1cbf0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
1cc00 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
1cc10 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
1cc20 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75  **  (21)  The su
1cc30 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1cc40 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1cc50 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1cc60 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1cc70 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
1cc80 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
1cc90 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20  ])..**.**  (22) 
1cca0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1ccb0 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1ccc0 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33   CTE..**.**  (23
1ccd0 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73  )  The parent is
1cce0 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1ccf0 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62   CTE, or the sub
1cd00 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a  -query is not a.
1cd10 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1cd20 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72  nd query. This r
1cd30 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65  estriction is be
1cd40 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69  cause transformi
1cd50 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
1cd60 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d   parent to a com
1cd70 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66  pound query conf
1cd80 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68  uses the code th
1cd90 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20  at handles.**   
1cda0 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71       recursive q
1cdb0 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53  ueries in multiS
1cdc0 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elect()..**.**  
1cdd0 28 32 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (24)  The subque
1cde0 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
1cdf0 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73  regate that uses
1ce00 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69   the built-in mi
1ce10 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20  n() or .**      
1ce20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74    or max() funct
1ce30 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20  ions.  (Without 
1ce40 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
1ce50 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a  , a query like:.
1ce60 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  **        "SELEC
1ce70 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
1ce80 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20   max(y), x FROM 
1ce90 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e  t1)" would not n
1cea0 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20  ecessarily.**   
1ceb0 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20       return the 
1cec0 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63  value X for whic
1ced0 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e  h Y was maximal.
1cee0 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ).**.**.** In th
1cef0 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
1cf00 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
1cf10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1cf20 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
1cf30 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
1cf40 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
1cf50 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
1cf60 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
1cf70 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
1cf80 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
1cf90 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
1cfa0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
1cfb0 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
1cfc0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
1cfd0 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
1cfe0 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
1cff0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1d000 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
1d010 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
1d020 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
1d030 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1d040 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
1d050 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
1d060 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
1d070 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
1d080 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d090 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
1d0a0 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
1d0b0 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
1d0c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
1d0d0 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
1d0e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1d0f0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1d100 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1d110 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1d120 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
1d130 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
1d140 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
1d150 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
1d160 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1d170 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
1d180 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
1d190 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
1d1a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1d1b0 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
1d1c0 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
1d1d0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1d1e0 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
1d1f0 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
1d200 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1d210 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1d220 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
1d230 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
1d240 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
1d250 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1d260 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
1d270 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63  pParent;.  Selec
1d280 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
1d290 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
1d2a0 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
1d2b0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
1d2c0 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
1d2d0 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
1d2e0 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
1d2f0 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
1d300 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
1d310 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1d320 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1d330 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
1d340 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
1d350 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1d360 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1d370 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
1d380 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
1d390 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
1d3a0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1d3b0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
1d3c0 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
1d3d0 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1d3e0 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
1d3f0 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
1d400 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
1d410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1d420 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1d430 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d450 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1d460 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1d470 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1d480 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
1d490 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1d4a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1d4b0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
1d4c0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1d4d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1d4e0 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
1d4f0 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
1d500 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
1d510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1d520 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a  pPrior==0 );  /*
1d530 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74   Unable to flatt
1d540 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  en compound quer
1d550 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ies */.  if( Opt
1d560 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1d570 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65  d(db, SQLITE_Que
1d580 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72  ryFlattener) ) r
1d590 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
1d5a0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
1d5b0 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
1d5c0 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
1d5d0 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
1d5e0 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
1d5f0 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61  >a[iFrom];.  iPa
1d600 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
1d610 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62  >iCursor;.  pSub
1d620 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
1d630 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
1d640 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
1d650 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1d660 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
1d670 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) 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 20 20 20 20 2f 2a 20 52 65             /* Re
1d6a0 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 20  striction (1)   
1d6b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
1d6c0 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
1d6d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d6f0 65 73 74 72 69 63 74 69 6f 6e 20 28 32 61 29 20  estriction (2a) 
1d700 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
1d710 70 57 68 65 72 65 20 26 26 20 45 78 70 72 48 61  pWhere && ExprHa
1d720 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 57 68  sProperty(p->pWh
1d730 65 72 65 2c 45 50 5f 53 75 62 71 75 65 72 79 29  ere,EP_Subquery)
1d740 29 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74  ).     || (sqlit
1d750 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
1d760 70 2d 3e 70 45 4c 69 73 74 29 20 26 20 45 50 5f  p->pEList) & EP_
1d770 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20  Subquery)!=0.   
1d780 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70    || (sqlite3Exp
1d790 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f  rListFlags(p->pO
1d7a0 72 64 65 72 42 79 29 20 26 20 45 50 5f 53 75 62  rderBy) & EP_Sub
1d7b0 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 29 7b  query)!=0.    ){
1d7c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d800 74 72 69 63 74 69 6f 6e 20 28 32 62 29 20 20 2a  triction (2b)  *
1d810 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20  /.    }.  }.    
1d820 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
1d830 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
1d840 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
1d850 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
1d860 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
1d870 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1d880 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
1d890 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
1d8a0 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
1d8b0 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
1d8c0 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
1d8d0 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
1d8e0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
1d8f0 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
1d900 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
1d910 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
1d920 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
1d930 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
1d940 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
1d950 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
1d960 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
1d970 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
1d980 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
1d990 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
1d9a0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
1d9b0 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
1d9c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d9d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d9e0 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
1d9f0 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65  ub->pOffset ) re
1da00 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1da30 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70  (14) */.  if( (p
1da40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1da50 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20  Compound)!=0 && 
1da60 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
1da70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dab0 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
1dac0 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
1dad0 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
1dae0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db00 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
1db10 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1db20 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1db30 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
1db40 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1db50 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20  Restriction (5) 
1db60 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1db70 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d  pLimit && (pSrc-
1db80 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
1db90 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
1dba0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1dbb0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28  estrictions (8)(
1dbc0 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  9) */.  }.  if( 
1dbd0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1dbe0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26  F_Distinct)!=0 &
1dbf0 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
1dc00 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1dc10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1dc20 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f  triction (6)  */
1dc30 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
1dc40 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e  rderBy && pSub->
1dc50 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1dc60 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc90 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dca0 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
1dcb0 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70    if( isAgg && p
1dcc0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
1dcd0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1dce0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dcf0 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a  riction (16) */.
1dd00 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1dd10 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20  it && p->pWhere 
1dd20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1dd30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dd40 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a  riction (19) */.
1dd50 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1dd60 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  it && (p->selFla
1dd70 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1dd80 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  )!=0 ){.     ret
1dd90 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
1dda0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1ddb0 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74  1) */.  }.  test
1ddc0 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46  case( pSub->selF
1ddd0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
1dde0 69 76 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ive );.  testcas
1ddf0 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  e( pSub->selFlag
1de00 73 20 26 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67  s & SF_MinMaxAgg
1de10 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   );.  if( pSub->
1de20 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52  selFlags & (SF_R
1de30 65 63 75 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d  ecursive|SF_MinM
1de40 61 78 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65  axAgg) ){.    re
1de50 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
1de60 69 63 74 69 6f 6e 73 20 28 32 32 29 20 61 6e 64  ictions (22) and
1de70 20 28 32 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (24) */.  }.  i
1de80 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1de90 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  & SF_Recursive) 
1dea0 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  && pSub->pPrior 
1deb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1dec0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1ded0 28 32 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  (23) */.  }..  /
1dee0 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
1def0 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 1:.  ** Restr
1df00 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
1df10 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
1df20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
1df30 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1df40 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
1df50 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1df60 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
1df70 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
1df80 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
1df90 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
1dfa0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1dfb0 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
1dfc0 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
1dfd0 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
1dfe0 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
1dff0 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
1e000 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
1e010 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
1e020 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
1e030 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
1e040 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
1e050 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
1e060 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53  g..  **.  ** OBS
1e070 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a  OLETE COMMENT 2:
1e080 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
1e090 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
1e0a0 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
1e0b0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1e0c0 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
1e0d0 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
1e0e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
1e0f0 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
1e100 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
1e110 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
1e120 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
1e130 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1e140 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
1e150 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
1e160 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
1e170 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
1e180 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
1e190 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
1e1a0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
1e1b0 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
1e1c0 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
1e1d0 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
1e1e0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
1e1f0 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
1e200 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
1e210 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
1e220 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
1e230 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
1e240 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
1e250 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
1e260 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49  N..  **.  ** THI
1e270 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f  S OVERRIDES OBSO
1e280 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20  LETE COMMENTS 1 
1e290 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a  AND 2 ABOVE:.  *
1e2a0 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73  * Ticket #3300 s
1e2b0 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65  hows that flatte
1e2c0 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74  ning the right t
1e2d0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
1e2e0 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67  IN.  ** is fraug
1e2f0 68 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20  ht with danger. 
1e300 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74   Best to avoid t
1e310 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20  he whole thing. 
1e320 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   If the.  ** sub
1e330 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1e340 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
1e350 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20  T JOIN, then do 
1e360 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a  not flatten..  *
1e370 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
1e380 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
1e390 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
1e3a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1e3b0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
1e3c0 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20  tion 17: If the 
1e3d0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1e3e0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
1e3f0 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
1e400 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
1e410 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1e420 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
1e430 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
1e440 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
1e450 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
1e460 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
1e470 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
1e480 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
1e490 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
1e4a0 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
1e4b0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1e4c0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
1e4d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1e4e0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
1e4f0 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a  striction 20 */.
1e500 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
1e510 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  Agg || (p->selFl
1e520 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1e530 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e  t)!=0 || pSrc->n
1e540 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  Src!=1 ){.      
1e550 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1e560 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53      for(pSub1=pS
1e570 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31  ub; pSub1; pSub1
1e580 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b  =pSub1->pPrior){
1e590 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e5a0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1e5b0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1e5c0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1e5d0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
1e5e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e5f0 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1e600 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1e610 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1e620 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
1e630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1e640 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20  ub->pSrc!=0 );. 
1e650 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1e660 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
1e670 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d  ==pSub1->pEList-
1e680 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1e690 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  if( (pSub1->selF
1e6a0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1e6b0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1e6c0 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ))!=0.       || 
1e6d0 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
1e6e0 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
1e6f0 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ALL) .       || 
1e700 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1e710 63 3c 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  c<1.      ){.   
1e720 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1e730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
1e740 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53  tcase( pSub1->pS
1e750 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20  rc->nSrc>1 );.  
1e760 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74    }..    /* Rest
1e770 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20  riction 18. */. 
1e780 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1e790 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
1e7a0 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
1e7b0 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72  =0; ii<p->pOrder
1e7c0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
1e7d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
1e7e0 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  >pOrderBy->a[ii]
1e7f0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
1e800 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1e810 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e820 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  }..  /***** If w
1e830 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
1e840 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
1e850 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
1e860 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43  **/.  SELECTTRAC
1e870 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66  E(1,pParse,p,("f
1e880 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f  latten %s.%p fro
1e890 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20  m term %d\n",.  
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c   pSub->zSelName,
1e8c0 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a   pSub, iFrom));.
1e8d0 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20  .  /* Authorize 
1e8e0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1e8f0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1e900 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65  ontext = pSubite
1e910 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54  m->zName;.  TEST
1e920 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65  ONLY(i =) sqlite
1e930 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1e940 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
1e950 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65  , 0, 0, 0);.  te
1e960 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54  stcase( i==SQLIT
1e970 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72  E_DENY );.  pPar
1e980 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1e990 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
1e9a0 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
1e9b0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1e9c0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
1e9d0 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
1e9e0 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
1e9f0 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
1ea00 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
1ea10 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
1ea20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
1ea30 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
1ea40 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
1ea50 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1ea60 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
1ea70 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
1ea80 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
1ea90 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
1eaa0 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
1eab0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
1eac0 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
1ead0 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
1eae0 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
1eaf0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
1eb00 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
1eb10 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
1eb20 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
1eb30 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
1eb40 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
1eb50 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
1eb60 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
1eb70 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
1eb80 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1eb90 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
1eba0 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
1ebb0 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
1ebc0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
1ebd0 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
1ebe0 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
1ebf0 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
1ec00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1ec10 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
1ec20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1ec30 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
1ec40 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
1ec50 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
1ec60 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
1ec70 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
1ec80 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1ec90 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1eca0 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
1ecb0 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
1ecc0 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
1ecd0 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
1ece0 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
1ecf0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1ed00 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
1ed10 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
1ed20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1ed30 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
1ed40 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
1ed50 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
1ed60 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1ed70 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
1ed80 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
1ed90 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
1eda0 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
1edb0 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
1edc0 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
1edd0 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
1ede0 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
1edf0 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
1ee00 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
1ee10 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
1ee20 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
1ee30 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
1ee40 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1ee50 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
1ee60 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
1ee70 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
1ee80 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73  .    Expr *pOffs
1ee90 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
1eea0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
1eeb0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
1eec0 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
1eed0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
1eee0 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
1eef0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
1ef00 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
1ef10 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
1ef20 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1ef30 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
1ef40 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   p, 0);.    sqli
1ef50 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
1ef60 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65  (pNew, pSub->zSe
1ef70 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70  lName);.    p->p
1ef80 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
1ef90 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
1efa0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d  = pLimit;.    p-
1efb0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
1efc0 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72  erBy;.    p->pSr
1efd0 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d  c = pSrc;.    p-
1efe0 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20  >op = TK_ALL;.  
1eff0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1f000 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
1f010 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = pPrior;.    }
1f020 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
1f030 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1f040 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  r;.      if( pPr
1f050 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e  ior ) pPrior->pN
1f060 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ext = pNew;.    
1f070 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
1f080 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  p;.      p->pPri
1f090 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  or = pNew;.     
1f0a0 20 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70   SELECTTRACE(2,p
1f0b0 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20  Parse,p,.       
1f0c0 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62    ("compound-sub
1f0d0 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20  query flattener 
1f0e0 63 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73  creates %s.%p as
1f0f0 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20   peer\n",.      
1f100 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d     pNew->zSelNam
1f110 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d  e, pNew));.    }
1f120 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
1f130 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1f140 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1f150 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67  Begin flattening
1f160 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e   the iFrom-th en
1f170 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
1f180 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20  clause .  ** in 
1f190 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1f1a0 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  .  */.  pSub = p
1f1b0 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d  Sub1 = pSubitem-
1f1c0 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
1f1d0 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73  Delete the trans
1f1e0 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
1f1f0 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
1f200 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
1f210 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71  bquery.  */.  sq
1f220 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f230 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
1f240 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ase);.  sqlite3D
1f250 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
1f260 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  em->zName);.  sq
1f270 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f280 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
1f290 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  );.  pSubitem->z
1f2a0 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1f2b0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
1f2c0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
1f2d0 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70  >zAlias = 0;.  p
1f2e0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1f2f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65   = 0;..  /* Defe
1f300 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54  r deleting the T
1f310 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f  able object asso
1f320 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
1f330 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e    ** subquery un
1f340 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
1f350 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  ion is.  ** comp
1f360 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72  lete, since ther
1f370 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73  e may still exis
1f380 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72  t Expr.pTab entr
1f390 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  ies that.  ** re
1f3a0 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75  fer to the subqu
1f3b0 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66  ery even after f
1f3c0 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b  lattening.  Tick
1f3d0 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20  et #3346..  **. 
1f3e0 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54   ** pSubitem->pT
1f3f0 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e  ab is always non
1f400 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65  -NULL by test re
1f410 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74  strictions and t
1f420 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f  ests above..  */
1f430 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
1f440 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29  ubitem->pTab!=0)
1f450 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
1f460 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69  TabToDel = pSubi
1f470 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
1f480 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52  f( pTabToDel->nR
1f490 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50  ef==1 ){.      P
1f4a0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1f4b0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1f4c0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1f4d0 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
1f4e0 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70  >pNextZombie = p
1f4f0 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
1f500 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70  eTab;.      pTop
1f510 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
1f520 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20  b = pTabToDel;. 
1f530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f540 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d  pTabToDel->nRef-
1f550 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  -;.    }.    pSu
1f560 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
1f570 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
1f580 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
1f590 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
1f5a0 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f   term in a compo
1f5b0 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a  und-subquery.  *
1f5c0 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73  * flattening (as
1f5d0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
1f5e0 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f  ).  If we are do
1f5f0 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
1f600 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61  kind.  ** of fla
1f610 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74  ttening - a flat
1f620 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61  tening other tha
1f630 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
1f640 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
1f650 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69   -.  ** then thi
1f660 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73  s loop only runs
1f670 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   once..  **.  **
1f680 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73   This loop moves
1f690 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
1f6a0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
1f6b0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1f6c0 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
1f6d0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1f6e0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
1f6f0 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
1f700 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
1f710 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
1f720 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
1f730 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
1f740 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
1f750 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
1f760 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
1f770 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
1f780 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
1f790 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
1f7a0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
1f7b0 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
1f7c0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
1f7d0 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
1f7e0 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
1f7f0 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
1f800 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
1f810 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
1f820 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
1f830 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
1f840 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ing in..  */.  f
1f850 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50  or(pParent=p; pP
1f860 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70  arent; pParent=p
1f870 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20  Parent->pPrior, 
1f880 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1f890 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62  r){.    int nSub
1f8a0 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e  Src;.    u8 join
1f8b0 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
1f8c0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1f8d0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
1f8e0 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
1f8f0 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
1f900 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
1f910 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
1f920 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
1f930 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
1f940 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
1f950 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
1f960 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
1f970 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1f980 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
1f990 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
1f9a0 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
1f9b0 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
1f9c0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
1f9d0 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
1f9e0 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
1f9f0 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
1fa00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1fa10 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70  sert( pParent!=p
1fa20 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20   );  /* 2nd and 
1fa30 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73  subsequent times
1fa40 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
1fa50 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20  p */.      pSrc 
1fa60 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  = pParent->pSrc 
1fa70 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1fa80 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c  Append(db, 0, 0,
1fa90 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
1faa0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
1fab0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
1fac0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1fad0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fae0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1faf0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
1fb00 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c  uses a single sl
1fb10 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ot of the FROM c
1fb20 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1fb30 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e  er.    ** query.
1fb40 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fb50 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  y has more than 
1fb60 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69  one element in i
1fb70 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  ts FROM clause,.
1fb80 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61      ** then expa
1fb90 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1fba0 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65  ry to make space
1fbb0 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20   for it to hold 
1fbc0 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  all elements.   
1fbd0 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75   ** of the subqu
1fbe0 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ery..    **.    
1fbf0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
1fc00 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c  **.    **    SEL
1fc10 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c  ECT * FROM tabA,
1fc20 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1fc30 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62  sub1, sub2), tab
1fc40 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  B;.    **.    **
1fc50 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1fc60 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20   has 3 slots in 
1fc70 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  its FROM clause.
1fc80 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68    One slot of th
1fc90 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1fca0 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65  uery (the middle
1fcb0 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62   slot) is used b
1fcc0 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  y the subquery. 
1fcd0 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   The next.    **
1fce0 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77   block of code w
1fcf0 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f  ill expand the o
1fd00 75 74 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c  ut query to 4 sl
1fd10 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65  ots.  The middle
1fd20 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20  .    ** slot is 
1fd30 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20  expanded to two 
1fd40 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74  slots in order t
1fd50 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1fd60 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20   the.    ** two 
1fd70 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1fd80 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1fd90 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
1fda0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62   */.    if( nSub
1fdb0 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  Src>1 ){.      p
1fdc0 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70  Parent->pSrc = p
1fdd0 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
1fde0 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20  ListEnlarge(db, 
1fdf0 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c  pSrc, nSubSrc-1,
1fe00 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20  iFrom+1);.      
1fe10 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1fe20 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
1fe30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1fe40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61     }..    /* Tra
1fe50 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63  nsfer the FROM c
1fe60 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d  lause terms from
1fe70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
1fe80 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  to the.    ** ou
1fe90 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
1fea0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1feb0 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
1fec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c        sqlite3IdL
1fed0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  istDelete(db, pS
1fee0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70  rc->a[i+iFrom].p
1fef0 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53  Using);.      pS
1ff00 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
1ff10 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
1ff20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
1ff30 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
1ff40 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
1ff50 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
1ff60 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d    pSrc->a[iFrom]
1ff70 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  .fg.jointype = j
1ff80 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20  ointype;.  .    
1ff90 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
1ffa0 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
1ffb0 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
1ffc0 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
1ffd0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
1ffe0 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
1fff0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
20000 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  ry..    ** .    
20010 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
20020 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
20030 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
20040 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
20050 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
20060 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
20070 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20  ;.    **   \    
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
200a0 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
200b0 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
200c0 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f      **    \_____
200d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
200e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
200f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20100 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20  ___________/.   
20110 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f   **.    ** We lo
20120 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
20130 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
20140 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
20150 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
20160 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73  .    ** "a" we s
20170 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
20180 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
20190 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
201a0 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
201b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73  .    */.    pLis
201c0 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  t = pParent->pEL
201d0 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
201e0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
201f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
20200 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
20210 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
20220 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
20230 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
20240 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
20250 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
20260 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
20270 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
20280 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
20290 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
202a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73  }.    }.    subs
202b0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
202c0 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69  arent->pEList, i
202d0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
202e0 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69  List);.    if( i
202f0 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75  sAgg ){.      su
20300 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
20310 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
20320 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
20330 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
20340 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
20350 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
20360 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
20370 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
20380 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
20390 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
203a0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
203b0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
203c0 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f  nt, any non-zero
203d0 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c   iOrderByCol val
203e0 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ues indicate tha
203f0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  t the.      ** O
20400 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65  RDER BY column e
20410 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65  xpression is ide
20420 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f  ntical to the iO
20430 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20  rderByCol'th.   
20440 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
20450 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
20460 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
20470 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20  ub. Since these 
20480 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
20490 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  do not necessari
204a0 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ly correspond to
204b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45   columns in SELE
204c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61  CT statement pPa
204d0 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a  rent,.      ** z
204e0 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20  ero them before 
204f0 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20  transfering the 
20500 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
20510 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
20520 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69  ** Not doing thi
20530 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65  s may cause an e
20540 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71  rror if a subseq
20550 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69  uent call to thi
20560 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
20570 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
20580 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75  flatten a compou
20590 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74  nd sub-query int
205a0 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20  o pParent.      
205b0 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79  ** (the only way
205c0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
205d0 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f   is if the compo
205e0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73  und sub-query is
205f0 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
20600 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62  tly part of pSub
20610 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63  ->pSrc). See tic
20620 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d  ket [d11a6e908f]
20630 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  .  */.      Expr
20640 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
20650 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
20660 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
20670 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
20680 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
20690 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
206a0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
206b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
206c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
206d0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
206e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
206f0 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30   pSub->pPrior==0
20700 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
20710 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  t->pOrderBy = pO
20720 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
20730 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
20740 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
20750 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
20760 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  y ){.      subst
20770 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
20780 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rent->pOrderBy, 
20790 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
207a0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
207b0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
207c0 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65  re ){.      pWhe
207d0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
207e0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
207f0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  here, 0);.    }e
20800 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
20810 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
20820 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
20830 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
20840 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
20850 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
20860 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
20870 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
20880 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
20890 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
208a0 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
208b0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75  nt->pHaving = su
208c0 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
208d0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
208e0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
208f0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
20900 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
20910 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
20920 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
20930 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ng, .           
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20960 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
20970 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20  pHaving, 0));.  
20980 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
20990 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ent->pGroupBy==0
209a0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
209b0 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  t->pGroupBy = sq
209c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
209d0 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
209e0 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  pBy, 0);.    }el
209f0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  se{.      pParen
20a00 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  t->pWhere = subs
20a10 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
20a20 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  t->pWhere, iPare
20a30 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
20a40 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
20a50 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
20a60 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
20a70 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70  arent->pWhere, p
20a80 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Where);.    }.  
20a90 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
20aa0 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
20ab0 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
20ac0 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
20ad0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
20ae0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
20af0 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
20b00 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
20b10 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
20b20 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
20b30 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
20b40 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
20b50 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
20b60 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
20b70 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
20b80 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
20b90 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
20ba0 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
20bb0 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
20bc0 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
20bd0 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
20be0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
20bf0 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
20c00 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
20c10 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
20c20 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
20c30 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
20c40 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
20c50 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
20c60 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
20c70 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
20c80 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
20c90 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
20ca0 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
20cb0 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
20cc0 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
20cd0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
20ce0 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  1);..#if SELECTT
20cf0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
20d00 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
20d10 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
20d20 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
20d30 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
20d40 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
20d50 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  ng:\n"));.    sq
20d60 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
20d70 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
20d80 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
20d90 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
20da0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
20db0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
20dc0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
20dd0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
20de0 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
20df0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
20e00 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
20e10 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
20e20 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  VIEW)./*.** Make
20e30 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76   copies of relev
20e40 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65  ant WHERE clause
20e50 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75   terms of the ou
20e60 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a  ter query into.*
20e70 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
20e80 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20  se of subquery. 
20e90 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
20ea0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
20eb0 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c   (SELECT a AS x,
20ec0 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74   c-d AS y FROM t
20ed0 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44  1) WHERE x=5 AND
20ee0 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61   y=10;.**.** Tra
20ef0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a  nsformed into:.*
20f00 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
20f10 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
20f20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
20f30 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
20f40 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20   AND c-d=10).** 
20f50 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e      WHERE x=5 AN
20f60 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68  D y=10;.**.** Th
20f70 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20 74  e hope is that t
20f80 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20 74  he terms added t
20f90 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72  o the inner quer
20fa0 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d  y will make it m
20fb0 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74  ore.** efficient
20fc0 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ..**.** Do not a
20fd0 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69  ttempt this opti
20fe0 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a  mization if:.**.
20ff0 2a 2a 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e  **   (1) The inn
21000 65 72 20 71 75 65 72 79 20 69 73 20 61 6e 20 61  er query is an a
21010 67 67 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74  ggregate.  (In t
21020 68 61 74 20 63 61 73 65 2c 20 77 65 27 64 20 72  hat case, we'd r
21030 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20  eally want.**   
21040 20 20 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20      to copy the 
21050 6f 75 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75  outer WHERE-clau
21060 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  se terms onto th
21070 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
21080 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
21090 69 6e 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75  inner query.  Bu
210a0 74 20 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20  t they probably 
210b0 77 6f 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65  won't help there
210c0 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65   so do not bothe
210d0 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  r.).**.**   (2) 
210e0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
210f0 69 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65  is the recursive
21100 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f   part of a commo
21110 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69  n table expressi
21120 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  on..**.**   (3) 
21130 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
21140 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  has a LIMIT clau
21150 73 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68  se (since the ch
21160 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45  anges to the WHE
21170 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73  RE.**       clos
21180 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74  e would change t
21190 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
211a0 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20  e LIMIT)..**.** 
211b0 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20    (4) The inner 
211c0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
211d0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
211e0 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65  LEFT JOIN.  (The
211f0 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20   caller.**      
21200 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72   enforces this r
21210 65 73 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65  estriction since
21220 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
21230 65 73 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75  es not have enou
21240 67 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f  gh.**       info
21250 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e  rmation to know.
21260 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68  ).**.**   (5) Th
21270 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  e WHERE clause e
21280 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
21290 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ates in the ON o
212a0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a  r USING clause.*
212b0 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46  *       of a LEF
212c0 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65  T JOIN..**.** Re
212d0 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61  turn 0 if no cha
212e0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e  nges are made an
212f0 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e  d non-zero if on
21300 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20  e or more WHERE 
21310 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20  clause.** terms 
21320 61 72 65 20 64 75 70 6c 69 63 61 74 65 64 20 69  are duplicated i
21330 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79  nto the subquery
21340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21350 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
21360 6d 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ms(.  sqlite3 *d
21370 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  b,          /* T
21380 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
21390 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c  ection (for mall
213a0 6f 63 28 29 29 20 2a 2f 0a 20 20 53 65 6c 65 63  oc()) */.  Selec
213b0 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20  t *pSubq,       
213c0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
213d0 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61   whose WHERE cla
213e0 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67  use is to be aug
213f0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  mented */.  Expr
21400 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
21410 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
21420 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
21430 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
21440 74 20 69 43 75 72 73 6f 72 20 20 20 20 20 20 20  t iCursor       
21450 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
21460 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71  mber of the subq
21470 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uery */.){.  Exp
21480 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
21490 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  Chng = 0;.  if( 
214a0 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75  pWhere==0 ) retu
214b0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75  rn 0;.  if( (pSu
214c0 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  bq->selFlags & (
214d0 53 46 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f  SF_Aggregate|SF_
214e0 52 65 63 75 72 73 69 76 65 29 29 21 3d 30 20 29  Recursive))!=0 )
214f0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
21500 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73   /* restrictions
21510 20 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a   (1) and (2) */.
21520 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d    }.  if( pSubq-
21530 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20  >pLimit!=0 ){.  
21540 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
21550 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20  restriction (3) 
21560 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
21570 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
21580 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20  ND ){.    nChng 
21590 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  += pushDownWhere
215a0 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c  Terms(db, pSubq,
215b0 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c   pWhere->pRight,
215c0 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70   iCursor);.    p
215d0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
215e0 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
215f0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
21600 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
21610 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
21620 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
21630 35 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  5 */.  if( sqlit
21640 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
21650 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
21660 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
21670 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
21680 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
21690 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
216a0 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72  xprDup(db, pWher
216b0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  e, 0);.      pNe
216c0 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  w = substExpr(db
216d0 2c 20 70 4e 65 77 2c 20 69 43 75 72 73 6f 72 2c  , pNew, iCursor,
216e0 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 29 3b   pSubq->pEList);
216f0 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57  .      pSubq->pW
21700 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
21710 70 72 41 6e 64 28 64 62 2c 20 70 53 75 62 71 2d  prAnd(db, pSubq-
21720 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a  >pWhere, pNew);.
21730 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53        pSubq = pS
21740 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  ubq->pPrior;.   
21750 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21760 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20  nChng;.}.#endif 
21770 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
21780 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21790 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
217a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
217b0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20  */../*.** Based 
217c0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
217d0 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  of the AggInfo s
217e0 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
217f0 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a  ed by the first.
21800 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69  ** argument, thi
21810 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
21820 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
21830 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
21840 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72  **    * the quer
21850 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20  y contains just 
21860 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61  a single aggrega
21870 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20  te function,.** 
21880 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61     * the aggrega
21890 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  te function is e
218a0 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d  ither min() or m
218b0 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  ax(), and.**    
218c0 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * the argument t
218d0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
218e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  function is a co
218f0 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  lumn value..**.*
21900 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
21910 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20  above are true, 
21920 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  then WHERE_ORDER
21930 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
21940 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69  ORDERBY_MAX.** i
21950 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70  s returned as ap
21960 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c  propriate. Also,
21970 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
21980 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
21990 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72  e .** list of ar
219a0 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
219b0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
219c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
219d0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
219e0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
219f0 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c  ove are not met,
21a00 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
21a10 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48  t to 0 and.** WH
21a20 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
21a30 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  AL is returned..
21a40 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
21a50 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f  MaxQuery(AggInfo
21a60 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72   *pAggInfo, Expr
21a70 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29  List **ppMinMax)
21a80 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57  {.  int eRet = W
21a90 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
21aa0 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  MAL;          /*
21ab0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
21ac0 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  ..  *ppMinMax = 
21ad0 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  0;.  if( pAggInf
21ae0 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  o->nFunc==1 ){. 
21af0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
21b00 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
21b10 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67  [0].pExpr; /* Ag
21b20 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
21b30 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
21b40 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72   *pEList = pExpr
21b50 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20  ->x.pList;      
21b60 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
21b70 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  agg function */.
21b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
21b90 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
21ba0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69  UNCTION );.    i
21bb0 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
21bc0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  ist->nExpr==1 &&
21bd0 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
21be0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
21bf0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
21c00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
21c10 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  c = pExpr->u.zTo
21c20 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ken;.      if( s
21c30 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
21c40 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
21c50 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
21c60 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
21c70 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  IN;.        *ppM
21c80 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
21c90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21ca0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
21cb0 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
21cc0 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
21cd0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
21ce0 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MAX;.        *pp
21cf0 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
21d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21d10 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
21d20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a  pMinMax==0 || (*
21d30 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72  ppMinMax)->nExpr
21d40 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
21d50 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eRet;.}../*.** T
21d60 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
21d70 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
21d80 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
21d90 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
21da0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
21db0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
21dc0 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
21dd0 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20   aggregate-info 
21de0 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a  object. This .**
21df0 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
21e00 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
21e10 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
21e20 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75  .**   SELECT cou
21e30 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
21e40 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
21e50 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65  le is a database
21e60 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75   table, not a su
21e70 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
21e80 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a  . If the query.*
21e90 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69  * does match thi
21ea0 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
21eb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
21ec0 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   Table object re
21ed0 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74  presenting.** <t
21ee0 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  bl> is returned.
21ef0 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
21f00 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
21f10 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69  atic Table *isSi
21f20 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74  mpleCount(Select
21f30 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41   *p, AggInfo *pA
21f40 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65  ggInfo){.  Table
21f50 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a   *pTab;.  Expr *
21f60 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74  pExpr;..  assert
21f70 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  ( !p->pGroupBy )
21f80 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  ;..  if( p->pWhe
21f90 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  re || p->pEList-
21fa0 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c  >nExpr!=1 .   ||
21fb0 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
21fc0 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  1 || p->pSrc->a[
21fd0 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a  0].pSelect.  ){.
21fe0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21ff0 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  }.  pTab = p->pS
22000 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
22010 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
22020 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
22030 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
22040 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  & !pTab->pSelect
22050 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20   && pExpr );..  
22060 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
22070 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
22080 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
22090 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
220a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
220b0 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66  f( NEVER(pAggInf
220c0 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72  o->nFunc==0) ) r
220d0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
220e0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
220f0 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  0].pFunc->funcFl
22100 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
22110 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
22120 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
22130 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
22140 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
22150 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
22160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
22170 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
22180 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
22190 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
221a0 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
221b0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
221c0 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
221d0 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
221e0 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
221f0 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
22200 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
22210 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
22220 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
22230 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
22240 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
22250 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
22260 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
22270 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
22280 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
22290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
222a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
222b0 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
222c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
222d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
222e0 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
222f0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
22300 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pFrom->fg.isInde
22310 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62  xedBy ){.    Tab
22320 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
22330 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
22340 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70   *zIndexedBy = p
22350 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  From->u1.zIndexe
22360 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dBy;.    Index *
22370 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
22380 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
22390 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
223a0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
223b0 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
223c0 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20  ndexedBy); .    
223d0 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
223e0 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
223f0 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
22400 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22410 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
22420 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
22430 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a  zIndexedBy, 0);.
22440 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
22450 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
22460 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22470 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
22480 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e      pFrom->pIBIn
22490 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
224a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
224b0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
224c0 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
224d0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
224e0 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
224f0 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
22500 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
22510 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
22520 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
22530 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
22540 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
22550 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
22560 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
22570 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
22580 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
22590 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
225a0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
225b0 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
225c0 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
225d0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
225e0 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
225f0 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
22600 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
22610 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
22620 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
22630 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
22640 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
22650 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
22660 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
22670 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
22680 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
22690 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
226a0 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
226b0 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
226c0 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
226d0 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
226e0 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
226f0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
22700 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
22710 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
22720 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
22730 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
22740 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
22750 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
22760 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
22770 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
22780 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
22790 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
227a0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
227b0 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
227c0 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
227d0 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
227e0 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
227f0 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
22800 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
22810 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
22820 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
22830 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
22840 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
22850 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
22860 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
22870 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
22880 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
22890 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
228a0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
228b0 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
228c0 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
228d0 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
228e0 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
228f0 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
22900 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
22910 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
22920 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
22930 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
22940 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
22950 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
22960 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
22970 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
22980 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
22990 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
229a0 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
229b0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
229c0 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
229d0 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
229e0 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
229f0 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
22a00 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
22a10 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
22a20 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
22a30 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
22a40 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
22a50 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
22a60 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
22a70 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
22a80 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
22a90 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
22aa0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
22ab0 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
22ac0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22ad0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
22ae0 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
22af0 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
22b00 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
22b10 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
22b20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
22b30 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
22b40 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
22b50 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
22b60 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
22b70 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
22b80 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
22b90 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
22ba0 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
22bb0 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
22bc0 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
22bd0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
22be0 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
22bf0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
22c00 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d  K_ALL, 0));.  p-
22c10 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
22c20 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30  .  p->pWhere = 0
22c30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
22c40 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
22c50 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70  pHaving = 0;.  p
22c60 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
22c70 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  0;.  p->pPrior =
22c80 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   0;.  p->pNext =
22c90 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d   0;.  p->pWith =
22ca0 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   0;.  p->selFlag
22cb0 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e  s &= ~SF_Compoun
22cc0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  d;.  assert( (p-
22cd0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
22ce0 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a  onverted)==0 );.
22cf0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
22d00 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20   SF_Converted;. 
22d10 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
22d20 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e  Prior!=0 );.  pN
22d30 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ew->pPrior->pNex
22d40 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77  t = pNew;.  pNew
22d50 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
22d60 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
22d70 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
22d80 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66  Continue;.}..#if
22d90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22da0 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  _CTE./*.** Argum
22db0 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68  ent pWith (which
22dc0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f   may be NULL) po
22dd0 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64  ints to a linked
22de0 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20   list of nested 
22df0 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74  .** WITH context
22e00 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f  s, from inner to
22e10 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74   outermost. If t
22e20 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
22e30 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20  ied by .** FROM 
22e40 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70  clause element p
22e50 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61  Item is really a
22e60 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78   common-table-ex
22e70 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a  pression (CTE) .
22e80 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  ** then return a
22e90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
22ea0 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66  CTE definition f
22eb0 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f  or that table. O
22ec0 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75  therwise.** retu
22ed0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
22ee0 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  f a non-NULL val
22ef0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ue is returned, 
22f00 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74  set *ppContext t
22f10 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57  o point to the W
22f20 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ith.** object th
22f30 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
22f40 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  CTE belongs to..
22f50 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
22f60 20 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68   Cte *searchWith
22f70 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  (.  With *pWith,
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
22fa0 75 74 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c  utermost WITH cl
22fb0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
22fc0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
22fd0 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f  Item,     /* FRO
22fe0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
22ff0 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20   to resolve */. 
23000 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78   With **ppContex
23010 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
23020 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c   /* OUT: WITH cl
23030 61 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75  ause return valu
23040 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
23050 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
23060 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49  *zName;.  if( pI
23070 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
23080 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49  0 && (zName = pI
23090 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  tem->zName)!=0 )
230a0 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20  {.    With *p;. 
230b0 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20     for(p=pWith; 
230c0 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b  p; p=p->pOuter){
230d0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
230e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
230f0 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
23100 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
23110 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
23120 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  p->a[i].zName)==
23130 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
23140 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20  ppContext = p;. 
23150 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
23160 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  &p->a[i];.      
23170 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23180 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
23190 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65  ;.}../* The code
231a0 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74   generator maint
231b0 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20  ains a stack of 
231c0 61 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75  active WITH clau
231d0 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ses.** with the 
231e0 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20  inner-most WITH 
231f0 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20  clause being at 
23200 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
23210 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
23220 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20   routine pushes 
23230 74 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20  the WITH clause 
23240 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
23250 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
23260 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66   onto the top of
23270 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61   the stack. If a
23280 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73  rgument bFree is
23290 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73   true, then this
232a0 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20  .** WITH clause 
232b0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f  will never be po
232c0 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
232d0 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
232e0 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  e it.** should b
232f0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
23300 74 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  th the Parse obj
23310 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61  ect. In other ca
23320 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72  ses, when.** bFr
23330 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20  ee==0, the With 
23340 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66  object will be f
23350 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
23360 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73  the SELECT .** s
23370 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68  tatement with wh
23380 69 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69  ich it is associ
23390 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
233a0 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61  lite3WithPush(Pa
233b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74  rse *pParse, Wit
233c0 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72  h *pWith, u8 bFr
233d0 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62  ee){.  assert( b
233e0 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61 72 73  Free==0 || pPars
233f0 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20  e->pWith==0 );. 
23400 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
23410 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20    pWith->pOuter 
23420 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
23430 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
23440 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
23450 70 50 61 72 73 65 2d 3e 62 46 72 65 65 57 69 74  pParse->bFreeWit
23460 68 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d 0a 7d  h = bFree;.  }.}
23470 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
23480 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
23490 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72  argument pFrom r
234a0 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64  efers to a CTE d
234b0 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61  eclared by .** a
234c0 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20   WITH clause on 
234d0 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e  the stack curren
234e0 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  tly maintained b
234f0 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e  y the parser. An
23500 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74  d,.** if current
23510 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  ly processing a 
23520 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  CTE expression, 
23530 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72  if it is a recur
23540 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  sive.** referenc
23550 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
23560 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   CTE..**.** If p
23570 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20  From falls into 
23580 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
23590 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f  o categories abo
235a0 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a  ve, pFrom->pTab.
235b0 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
235c0 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  lds are populate
235d0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
235e0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
235f0 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d   check.** (pFrom
23600 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65  ->pTab!=0) to de
23610 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
23620 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73  or not a success
23630 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73  ful match.** was
23640 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   found..**.** Wh
23650 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d  ether or not a m
23660 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53  atch is found, S
23670 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
23680 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
23690 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61  .** occurs. If a
236a0 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
236b0 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ur, an error mes
236c0 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
236d0 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20  n the.** parser 
236e0 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63  and some error c
236f0 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ode other than S
23700 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
23710 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
23720 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57   withExpand(.  W
23730 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
23740 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
23750 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b  t_item *pFrom.){
23760 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23770 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
23780 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
23790 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
237a0 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
237b0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
237c0 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45    /* Matched CTE
237d0 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20   (or NULL if no 
237e0 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68  match) */.  With
237f0 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20   *pWith;        
23800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
23810 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20  ITH clause that 
23820 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  pCte belongs to 
23830 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
23840 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
23850 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68  .  pCte = search
23860 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69  With(pParse->pWi
23870 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74  th, pFrom, &pWit
23880 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29  h);.  if( pCte )
23890 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
238a0 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  b;.    ExprList 
238b0 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c  *pEList;.    Sel
238c0 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53  ect *pSel;.    S
238d0 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20  elect *pLeft;   
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
238f0 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  Left-most SELECT
23900 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
23910 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73    int bMayRecurs
23920 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
23930 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f  /* True if compo
23940 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e  und joined by UN
23950 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20  ION [ALL] */.   
23960 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74   With *pSavedWit
23970 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
23980 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
23990 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  of pParse->pWith
239a0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   */..    /* If p
239b0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
239c0 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
239d0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
239e0 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
239f0 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
23a00 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
23a10 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
23a20 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
23a30 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
23a40 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
23a50 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55  e->zCteErr is NU
23a60 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  LL, then this is
23a70 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
23a80 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20   reference..    
23a90 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
23aa0 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20   proceed.  */.  
23ab0 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65    if( pCte->zCte
23ac0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
23ad0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23ae0 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45  rse, pCte->zCteE
23af0 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
23b00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
23b10 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
23b20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
23b30 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
23b40 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
23b50 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
23b60 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
23b70 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
23b80 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
23b90 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23ba0 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
23bb0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
23bc0 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
23bd0 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
23be0 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
23bf0 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
23c00 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
23c10 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
23c20 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
23c30 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
23c40 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62  576) );.    pTab
23c50 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
23c60 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f  _Ephemeral | TF_
23c70 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
23c80 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
23c90 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
23ca0 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  ctDup(db, pCte->
23cb0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
23cc0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
23cd0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
23ce0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
23cf0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
23d00 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
23d10 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
23d20 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
23d30 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
23d40 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
23d50 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
23d60 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
23d70 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
23d80 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
23d90 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
23da0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
23db0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
23dc0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
23dd0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
23de0 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
23df0 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
23e00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23e10 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
23e20 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
23e30 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
23e40 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
23e50 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
23e60 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
23e70 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
23e80 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
23e90 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
23ea0 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
23eb0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
23ec0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
23ed0 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
23ee0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
23ef0 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  isRecursive = 1;
23f00 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
23f10 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
23f20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
23f30 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76  s |= SF_Recursiv
23f40 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
23f50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23f60 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75  /* Only one recu
23f70 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
23f80 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f  is permitted. */
23f90 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e   .    if( pTab->
23fa0 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20  nRef>2 ){.      
23fb0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23fc0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
23fd0 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66  e, "multiple ref
23fe0 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72  erences to recur
23ff0 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c  sive table: %s",
24000 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pCte->zName.   
24010 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75     );.      retu
24020 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
24030 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
24040 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31  t( pTab->nRef==1
24050 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46   || ((pSel->selF
24060 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76  lags&SF_Recursiv
24070 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66  e) && pTab->nRef
24080 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74  ==2 ));..    pCt
24090 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69  e->zCteErr = "ci
240a0 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65  rcular reference
240b0 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65  : %s";.    pSave
240c0 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e  dWith = pParse->
240d0 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
240e0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
240f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
24100 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
24110 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f   bMayRecursive ?
24120 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20   pSel->pPrior : 
24130 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pSel);..    for(
24140 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
24150 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
24160 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
24170 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
24180 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
24190 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
241a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
241b0 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
241c0 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
241d0 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
241e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
241f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
24200 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61  ble %s has %d va
24210 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75  lues for %d colu
24220 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mns",.          
24230 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70    pCte->zName, p
24240 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43  EList->nExpr, pC
24250 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
24260 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
24270 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
24280 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
24290 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
242a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
242b0 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
242c0 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
242d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
242e0 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
242f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
24300 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
24310 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
24320 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
24330 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
24340 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
24350 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
24360 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
24370 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d  te->zCteErr = "m
24380 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76  ultiple recursiv
24390 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73  e references: %s
243a0 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
243b0 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
243c0 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73 69  teErr = "recursi
243d0 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ve reference in 
243e0 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b  a subquery: %s";
243f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
24400 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
24410 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
24420 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d  .    }.    pCte-
24430 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  >zCteErr = 0;.  
24440 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24450 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
24460 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
24470 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
24480 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24490 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49  OMIT_CTE./*.** I
244a0 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73  f the SELECT pas
244b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
244c0 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  d argument has a
244d0 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54  n associated WIT
244e0 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f  H .** clause, po
244f0 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  p it from the st
24500 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61  ack stored as pa
24510 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20  rt of the Parse 
24520 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
24530 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
24540 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65  sed as the xSele
24550 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61  ctCallback2() ca
24560 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c  llback by.** sql
24570 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
24580 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20  () when walking 
24590 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f  a SELECT tree to
245a0 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a   resolve table.*
245b0 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65  * names and othe
245c0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  r FROM clause el
245d0 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74  ements. .*/.stat
245e0 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f  ic void selectPo
245f0 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  pWith(Walker *pW
24600 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
24610 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
24620 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
24630 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70 57  arse;.  With *pW
24640 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d  ith = findRightm
24650 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20  ost(p)->pWith;. 
24660 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b   if( pWith!=0 ){
24670 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24680 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74  rse->pWith==pWit
24690 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  h );.    pParse-
246a0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
246b0 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65  pOuter;.  }.}.#e
246c0 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65  lse.#define sele
246d0 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64  ctPopWith 0.#end
246e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
246f0 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
24700 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
24710 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
24720 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
24730 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
24740 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
24750 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
24760 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
24770 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
24780 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
24790 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
247a0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
247b0 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
247c0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
247d0 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
247e0 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
247f0 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
24800 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
24810 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
24820 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
24830 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
24840 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
24850 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
24860 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
24870 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
24880 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
24890 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
248a0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
248b0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
248c0 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
248d0 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
248e0 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
248f0 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
24900 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
24910 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
24920 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
24930 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
24940 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
24950 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
24960 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74  g up the persist
24970 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
24980 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
24990 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
249a0 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
249b0 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
249c0 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d  clause to accomm
249d0 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
249e0 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
249f0 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
24a00 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
24a10 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
24a20 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
24a30 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
24a40 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
24a50 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
24a60 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
24a70 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
24a80 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
24a90 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
24aa0 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
24ab0 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
24ac0 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
24ad0 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
24ae0 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
24af0 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
24b00 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
24b10 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
24b20 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
24b30 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
24b40 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
24b50 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
24b60 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
24b70 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
24b80 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
24b90 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
24ba0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
24bb0 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
24bc0 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
24bd0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
24be0 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
24bf0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
24c00 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52  .  Expr *pE, *pR
24c10 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20  ight, *pExpr;.  
24c20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70  u16 selFlags = p
24c30 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70  ->selFlags;..  p
24c40 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
24c50 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28  _Expanded;.  if(
24c60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
24c70 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
24c80 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
24c90 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
24ca0 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46  Src==0) || (selF
24cb0 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
24cc0 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
24cd0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
24ce0 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
24cf0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
24d00 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
24d10 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 78    if( pWalker->x
24d20 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 3d  SelectCallback2=
24d30 3d 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 29  =selectPopWith )
24d40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74  {.    sqlite3Wit
24d50 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 66 69  hPush(pParse, fi
24d60 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
24d70 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a  pWith, 0);.  }..
24d80 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
24d90 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
24da0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
24db0 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
24dc0 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
24dd0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
24de0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
24df0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
24e00 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
24e10 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
24e20 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
24e30 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
24e40 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
24e50 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
24e60 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
24e70 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
24e80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
24e90 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
24ea0 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
24eb0 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
24ec0 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
24ed0 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
24ee0 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
24ef0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
24f00 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
24f10 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
24f20 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
24f30 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
24f40 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
24f50 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
24f60 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
24f70 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f  rsive==0 || pFro
24f80 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  m->pTab!=0 );.  
24f90 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
24fa0 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f  isRecursive ) co
24fb0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
24fc0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
24fd0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
24fe0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
24ff0 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64    if( withExpand
25000 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29  (pWalker, pFrom)
25010 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
25020 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72  ort;.    if( pFr
25030 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c  om->pTab ) {} el
25040 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
25050 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
25060 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
25070 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
25080 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
25090 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
250a0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
250b0 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
250c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
250d0 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
250e0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
250f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
25100 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
25110 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
25120 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
25130 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
25140 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
25150 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f  bort;.      pFro
25160 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
25170 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
25180 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
25190 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69  Table));.      i
251a0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
251b0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
251c0 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20       pTab->nRef 
251d0 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  = 1;.      pTab-
251e0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
251f0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
25200 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69  ite_sq_%p", (voi
25210 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
25220 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
25230 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53  ior ){ pSel = pS
25240 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20  el->pPrior; }.  
25250 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
25260 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
25270 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c  Parse, pSel->pEL
25280 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ist,&pTab->nCol,
25290 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
252a0 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
252b0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62  = -1;.      pTab
252c0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
252d0 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
252e0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
252f0 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20  048576) );.     
25300 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
25310 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
25320 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
25330 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
25340 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
25350 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
25360 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
25370 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25380 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
25390 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
253a0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
253b0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
253c0 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  em(pParse, 0, pF
253d0 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rom);.      if( 
253e0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
253f0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25400 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66    if( pTab->nRef
25410 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  ==0xffff ){.    
25420 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25430 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
25440 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73   many references
25450 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20   to \"%s\": max 
25460 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20  65535",.        
25470 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b     pTab->zName);
25480 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
25490 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
254a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
254b0 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
254c0 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
254d0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
254e0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
254f0 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
25500 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
25510 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
25520 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  pTab->pSelect ||
25530 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
25540 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25550 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
25560 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
25570 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
25580 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25590 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
255a0 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
255b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
255c0 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  om->fg.isTabFunc
255d0 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
255e0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
255f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
25600 67 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20  g(pParse, "'%s' 
25610 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f  is not a functio
25620 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
25630 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
25640 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25660 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
25670 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
25680 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
25690 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
256a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
256b0 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65  tName(pFrom->pSe
256c0 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lect, pTab->zNam
256d0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
256e0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
256f0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
25700 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
25710 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
25720 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
25730 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
25740 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
25750 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
25760 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
25770 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
25780 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
25790 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
257a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
257b0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
257c0 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
257d0 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
257e0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
257f0 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
25800 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
25810 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
25820 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
25830 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
25840 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
25850 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
25860 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
25870 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
25880 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
25890 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
258a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
258b0 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
258c0 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
258d0 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
258e0 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
258f0 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
25900 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
25910 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
25920 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
25930 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
25940 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
25950 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
25960 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
25970 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
25980 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
25990 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
259a0 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
259b0 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
259c0 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
259d0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
259e0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
259f0 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
25a00 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
25a10 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
25a20 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
25a30 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
25a40 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
25a50 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
25a60 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
25a70 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
25a80 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70  k++){.    pE = p
25a90 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
25aa0 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
25ab0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
25ac0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
25ad0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
25ae0 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
25af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
25b00 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
25b10 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
25b20 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
25b30 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
25b40 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
25b50 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
25b60 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
25b70 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  ak;.  }.  if( k<
25b80 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
25b90 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
25ba0 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
25bb0 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
25bc0 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
25bd0 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
25be0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
25bf0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
25c00 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
25c10 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
25c20 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
25c30 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
25c40 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
25c50 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
25c60 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
25c70 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
25c80 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
25c90 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
25ca0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
25cb0 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
25cc0 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
25cd0 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
25ce0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
25cf0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d10 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
25d20 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
25d30 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
25d40 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
25d50 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
25d60 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
25d70 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68  xpr;.      pRigh
25d80 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
25d90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
25da0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
25db0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
25dc0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
25dd0 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
25de0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
25df0 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
25e00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
25e10 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
25e20 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
25e30 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
25e40 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
25e50 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
25e60 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
25e70 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
25e80 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
25e90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
25ea0 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
25eb0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
25ec0 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
25ed0 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
25ee0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
25ef0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
25f00 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
25f10 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
25f20 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
25f30 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
25f40 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
25f50 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
25f60 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
25f70 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
25f80 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
25f90 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
25fa0 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
25fb0 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
25fc0 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
25fd0 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
25fe0 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
25ff0 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
26000 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
26010 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
26020 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
26030 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
26040 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
26050 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
26060 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
26070 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
26080 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
26090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
260a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
260b0 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
260c0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
260d0 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
260e0 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
260f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26100 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
26110 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
26120 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
26130 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
26140 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
26150 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
26160 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
26170 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
26180 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
26190 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
261a0 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
261b0 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
261c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
261d0 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
261e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
261f0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
26200 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
26210 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
26220 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
26230 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
26240 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
26250 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
26260 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26270 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
26280 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
26290 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
262a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
262b0 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
262c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
262d0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
262e0 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
262f0 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
26300 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
26310 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
26320 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26330 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
26340 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
26350 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
26360 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
26370 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
26380 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
26390 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  zName : "*";.   
263a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
263b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
263c0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
263d0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
263e0 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
263f0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
26400 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
26410 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
26420 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
26430 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
26440 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
26450 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
26460 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
26470 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
26480 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
26490 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
264a0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
264b0 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
264c0 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
264d0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
264e0 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
264f0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
26500 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
26510 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
26520 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
26530 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
26540 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
26550 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
26560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26570 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26580 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
26590 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
265a0 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
265b0 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
265c0 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
265d0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
265e0 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
265f0 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
26600 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
26610 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
26620 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
26630 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
26640 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26650 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
26660 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
26670 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
26680 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26690 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
266a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
266b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
266c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
266d0 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
266e0 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   1;..           
266f0 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61   if( i>0 && zTNa
26700 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
26710 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f         if( (pFro
26720 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
26730 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a   JT_NATURAL)!=0.
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26750 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  && tableAndColum
26760 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c  nIndex(pTabList,
26770 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29   i, zName, 0, 0)
26780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
26790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
267a0 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
267b0 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
267c0 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
267d0 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
267e0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
267f0 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
26800 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20   the join */.   
26810 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
26820 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
26830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26840 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26850 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f  IdListIndex(pFro
26860 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  m->pUsing, zName
26870 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
26880 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
26890 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
268a0 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
268b0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
268c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
268d0 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
268e0 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
268f0 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
26910 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
26920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26930 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26940 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
26950 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
26960 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
26970 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
26980 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
26990 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b      zToFree = 0;
269a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
269b0 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54   longNames || pT
269c0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29  abList->nSrc>1 )
269d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
269e0 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20  Expr *pLeft;.   
269f0 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
26a00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
26a10 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61  b, TK_ID, zTabNa
26a20 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
26a30 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
26a40 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
26a50 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
26a60 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
26a70 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
26a80 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
26a90 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
26aa0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
26ab0 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
26ac0 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
26ad0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
26ae0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
26af0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
26b00 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  eft, pExpr, 0);.
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26b30 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
26b50 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
26b60 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
26b70 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
26b80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
26b90 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
26ba0 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
26bb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26bc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
26be0 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
26bf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26c00 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
26c10 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
26c20 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
26c30 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
26c40 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a        sColname.z
26c50 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
26c60 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
26c70 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  e.n = sqlite3Str
26c80 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b  len30(zColname);
26c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26ca0 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
26cb0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ame(pParse, pNew
26cc0 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b  , &sColname, 0);
26cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26ce0 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c   pNew && (p->sel
26cf0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
26d00 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20  dFrom)!=0 ){.   
26d10 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
26d20 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
26d30 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70  *pX = &pNew->a[p
26d40 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  New->nExpr-1];. 
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26d60 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20   pSub ){.       
26d70 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
26d80 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
26d90 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
26da0 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
26db0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
26dc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
26dd0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
26de0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
26df0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
26e00 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
26e10 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
26e20 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20  , "%s.%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 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
26e60 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Name, zTabName, 
26e70 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
26e80 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
26e90 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
26ea0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
26eb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26ec0 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61     pX->bSpanIsTa
26ed0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  b = 1;.         
26ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26ef0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
26f00 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
26f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26f20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
26f30 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
26f40 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
26f50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
26f60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
26f70 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
26f80 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
26f90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
26fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26fb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26fc0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
26fd0 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
26fe0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
26ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27000 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
27010 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
27020 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
27030 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
27040 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  New;.  }.#if SQL
27050 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
27060 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26   if( p->pEList &
27070 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  & p->pEList->nEx
27080 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
27090 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
270a0 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
270b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
270c0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
270d0 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
270e0 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t");.  }.#endif.
270f0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
27100 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
27110 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
27120 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
27130 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
27140 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27150 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
27160 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
27170 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
27180 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
27190 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
271a0 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
271b0 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
271c0 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
271d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
271e0 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
271f0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
27200 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
27210 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
27220 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
27230 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
27240 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
27250 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
27260 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  rser tree..*/.st
27270 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c  atic int exprWal
27280 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
27290 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
272a0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
272b0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
272c0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
272d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
272e0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
272f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
27300 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
27310 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
27320 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
27330 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
27340 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
27350 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
27360 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
27370 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
27380 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
27390 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
273a0 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
273b0 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
273c0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
273d0 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
273e0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
273f0 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
27400 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
27410 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
27420 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27430 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
27440 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
27450 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
27460 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
27470 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
27480 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
27490 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
274a0 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
274b0 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
274c0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
274d0 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
274e0 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
274f0 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
27500 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
27510 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
27520 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
27530 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
27540 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
27550 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
27560 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
27570 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
27580 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
27590 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
275a0 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
275b0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
275c0 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  e;.  if( pParse-
275d0 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a  >hasCompound ){.
275e0 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
275f0 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43  lback = convertC
27600 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
27610 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c  ubquery;.    sql
27620 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
27630 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
27640 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
27650 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
27660 61 6e 64 65 72 3b 0a 20 20 69 66 28 20 28 70 53  ander;.  if( (pS
27670 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
27680 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 29  & SF_MultiValue)
27690 3d 3d 30 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  ==0 ){.    w.xSe
276a0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
276b0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20  selectPopWith;. 
276c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b   }.  sqlite3Walk
276d0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
276e0 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
276f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
27700 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
27710 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
27720 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
27730 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
27740 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
27750 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
27760 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
27770 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
27780 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
27790 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
277a0 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
277b0 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
277c0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
277d0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
277e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
277f0 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
27800 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
27810 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
27820 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
27830 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
27840 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
27850 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
27860 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
27870 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
27880 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
27890 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
278a0 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
278b0 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
278c0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
278d0 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
278e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
278f0 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
27900 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
27910 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
27920 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
27930 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
27940 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
27950 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
27960 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
27970 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
27980 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
27990 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
279a0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
279b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
279c0 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73 73  esolved );.  ass
279d0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
279e0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
279f0 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  fo)==0 );.  p->s
27a00 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
27a10 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61  sTypeInfo;.  pPa
27a20 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
27a30 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73  Parse;.  pTabLis
27a40 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  t = p->pSrc;.  f
27a50 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
27a60 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
27a70 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
27a80 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
27a90 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
27aa0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  rom->pTab;.    a
27ab0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
27ac0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
27ad0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
27ae0 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a  phemeral)!=0 ){.
27af0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
27b00 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
27b10 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
27b20 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  ECT */.      Sel
27b30 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
27b40 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
27b50 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
27b60 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
27b70 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
27b80 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
27b90 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41  .        selectA
27ba0 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
27bb0 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
27bc0 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20   pTab, pSel);.  
27bd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
27be0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
27bf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
27c00 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20  ds datatype and 
27c10 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
27c20 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ce information t
27c30 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73  o.** the Table s
27c40 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c  tructures of all
27c50 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
27c60 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20  queries in a.** 
27c70 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27c80 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73  ..**.** Use this
27c90 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e   routine after n
27ca0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ame resolution..
27cb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
27cc0 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
27cd0 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ypeInfo(Parse *p
27ce0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
27cf0 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66  Select){.#ifndef
27d00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
27d10 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77  QUERY.  Walker w
27d20 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
27d30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
27d40 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
27d50 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
27d60 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
27d70 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
27d80 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
27d90 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
27da0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
27db0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
27dc0 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
27dd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
27de0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
27df0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27e00 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
27e10 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
27e20 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
27e30 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
27e40 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
27e50 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
27e60 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
27e70 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
27e80 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
27e90 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
27ea0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
27eb0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
27ec0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
27ed0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
27ee0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
27ef0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
27f00 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
27f10 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
27f20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
27f30 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
27f40 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
27f50 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
27f60 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
27f70 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
27f80 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
27f90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
27fa0 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
27fb0 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
27fc0 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
27fd0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
27fe0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
27ff0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
28000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
28010 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
28020 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
28030 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28040 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28050 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
28060 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
28070 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
28080 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
28090 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
280a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
280b0 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
280c0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
280d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
280e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
280f0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
28100 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
28110 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
28120 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
28130 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
28140 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
28150 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
28160 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
28170 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
28180 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
28190 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
281a0 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
281b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
281c0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
281d0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
281e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
281f0 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
28200 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
28210 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
28220 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
28230 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
28240 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
28250 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
28260 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
28270 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
28280 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
28290 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
282a0 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
282b0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
282c0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
282d0 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
282e0 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
282f0 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
28300 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
28310 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
28320 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
28330 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
28340 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
28350 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
28360 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
28370 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
28380 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d  nc;.  int nReg =
28390 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
283a0 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   + pAggInfo->nCo
283b0 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  lumn;.  if( nReg
283c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
283d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
283e0 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
283f0 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72  at all AggInfo r
28400 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74  egisters are wit
28410 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70  hin the range sp
28420 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20  ecified by.  ** 
28430 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41  AggInfo.mnReg..A
28440 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a  ggInfo.mxReg */.
28450 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d    assert( nReg==
28460 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d  pAggInfo->mxReg-
28470 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b  pAggInfo->mnReg+
28480 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 );.  for(i=0; 
28490 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
284a0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  umn; i++){.    a
284b0 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
284c0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  >aCol[i].iMem>=p
284d0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
284e0 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
284f0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
28500 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
28510 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  eg );.  }.  for(
28520 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
28530 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  >nFunc; i++){.  
28540 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
28550 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
28560 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
28570 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
28580 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
28590 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
285a0 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23  ->mxReg );.  }.#
285b0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
285c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
285d0 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
285e0 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e  o->mnReg, pAggIn
285f0 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f  fo->mxReg);.  fo
28600 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
28610 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
28620 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
28630 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
28640 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
28650 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
28660 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
28670 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
28680 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
28690 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
286a0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
286b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
286c0 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  x.pList==0 || pE
286d0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
286e0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
286f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28700 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
28710 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74   aggregates must
28720 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
28730 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
28740 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
28750 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
28760 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
28770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28780 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
28790 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
287a0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
287b0 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20  pE->x.pList, 0, 
287c0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
287d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
287e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
287f0 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
28800 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
28830 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
28840 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28850 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
28860 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
28870 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
28880 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
28890 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
288a0 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
288b0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
288c0 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
288d0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
288e0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
288f0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
28900 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28910 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
28920 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
28930 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
28940 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
28950 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
28960 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
28970 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
28980 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
28990 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
289a0 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
289b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
289c0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
289d0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
289e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
289f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp4(v, OP_AggF
28a00 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
28a10 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
28a20 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20  Expr : 0, 0,.   
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a40 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
28a50 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
28a60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
28a70 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
28a80 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
28a90 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
28aa0 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
28ab0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
28ac0 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
28ad0 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
28ae0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
28af0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
28b00 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
28b10 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
28b20 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
28b30 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69  t i;.  int regHi
28b40 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64  t = 0;.  int add
28b50 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20  rHitTest = 0;.  
28b60 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
28b70 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
28b80 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
28b90 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
28ba0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
28bb0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
28bc0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
28bd0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
28be0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
28bf0 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
28c00 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
28c10 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
28c20 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
28c30 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
28c40 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
28c50 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
28c60 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
28c70 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
28c80 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
28c90 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
28ca0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
28cb0 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
28cc0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
28cd0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67  nge(pParse, nArg
28ce0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28cf0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
28d00 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
28d10 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54  regAgg, 0, SQLIT
28d20 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20  E_ECEL_DUP);.   
28d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
28d40 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
28d50 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
28d60 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
28d70 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
28d80 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
28d90 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
28da0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
28db0 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b  case( nArg==0 );
28dc0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69    /* Error condi
28dd0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65  tion */.      te
28de0 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29  stcase( nArg>1 )
28df0 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65  ;   /* Also an e
28e00 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  rror */.      co
28e10 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
28e20 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  e, pF->iDistinct
28e30 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72  , addrNext, 1, r
28e40 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20  egAgg);.    }.  
28e50 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
28e60 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
28e70 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
28e80 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  L ){.      CollS
28e90 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
28ea0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
28eb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
28ec0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
28ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
28ee0 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69  st!=0 );  /* pLi
28ef0 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75  st!=0 if pF->pFu
28f00 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20  nc has NEEDCOLL 
28f10 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  */.      for(j=0
28f20 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
28f30 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41  ; !pColl && j<nA
28f40 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rg; j++, pItem++
28f50 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
28f60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
28f70 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
28f80 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
28f90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
28fa0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
28fb0 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
28fc0 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
28fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28fe0 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70  ( regHit==0 && p
28ff0 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
29000 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d  lator ) regHit =
29010 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
29020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29030 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
29040 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20  ollSeq, regHit, 
29050 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
29060 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
29070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29080 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
29090 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c   OP_AggStep0, 0,
290a0 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
290b0 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
290c0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
290d0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
290e0 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
290f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
29100 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
29110 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
29120 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
29130 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
29140 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
29150 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
29160 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
29170 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
29180 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
29190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
291a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
291b0 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
291c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
291d0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
291e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
291f0 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
29200 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
29210 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
29220 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
29230 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
29240 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
29250 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
29260 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
29270 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
29280 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
29290 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
292a0 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
292b0 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
292c0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
292d0 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
292e0 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
292f0 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
29300 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
29310 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
29320 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
29330 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
29340 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
29350 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
29360 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
29370 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
29380 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
29390 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
293a0 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
293b0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
293c0 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
293d0 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
293e0 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
293f0 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
29400 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
29410 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
29420 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
29430 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
29440 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
29450 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
29460 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
29470 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
29480 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
29490 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
294a0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
294b0 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
294c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
294d0 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
294e0 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
294f0 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
29500 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
29510 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29520 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
29530 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
29540 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
29550 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
29560 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
29570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
29580 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
29590 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
295a0 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
295b0 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
295c0 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
295d0 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
295e0 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
295f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
29600 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
29610 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
29620 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
29630 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
29640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29650 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
29660 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
29670 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
29680 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
29690 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
296a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
296b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296c0 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
296d0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
296e0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
296f0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
29700 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
29710 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49  int bCover = (pI
29720 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77  dx!=0 && (HasRow
29730 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50  id(pTab) || !IsP
29740 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
29750 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72  Idx)));.    char
29760 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33   *zEqp = sqlite3
29770 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
29780 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20  db, "SCAN TABLE 
29790 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
297a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
297b0 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22        bCover ? "
297c0 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
297d0 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
297e0 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70        bCover ? p
297f0 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
29800 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
29810 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
29820 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
29830 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  dbe, OP_Explain,
29840 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
29850 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20  Id, 0, 0, zEqp, 
29860 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
29870 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
29880 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69  define explainSi
29890 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29  mpleCount(a,b,c)
298a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
298b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
298c0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
298d0 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
298e0 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
298f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
29900 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
29910 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
29920 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
29930 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
29940 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
29950 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
29960 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
29970 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
29980 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
29990 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
299a0 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
299b0 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
299c0 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
299d0 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
299e0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
299f0 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
29a00 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
29a10 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
29a20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
29a30 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
29a40 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
29a50 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
29a60 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
29a70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
29a80 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
29a90 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
29aa0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
29ab0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
29ac0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
29ad0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
29ae0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
29af0 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
29b00 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
29b10 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
29b20 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
29b30 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
29b40 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
29b50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
29b60 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
29b70 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
29b80 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
29b90 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
29ba0 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
29bb0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
29bc0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
29bd0 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
29be0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
29bf0 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
29c00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29c10 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
29c20 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
29c30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
29c40 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  pEList = 0;  /* 
29c50 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
29c60 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
29c70 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
29c80 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
29c90 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
29ca0 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
29cb0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
29cc0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
29cd0 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
29ce0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
29cf0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
29d00 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
29d10 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
29d20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
29d30 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
29d40 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
29d50 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
29d60 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
29d70 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
29d80 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
29d90 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
29da0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
29db0 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
29dc0 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
29dd0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
29de0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
29df0 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
29e00 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
29e10 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
29e20 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
29e30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
29e40 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
29e50 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
29e60 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
29e70 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
29e80 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
29e90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
29ea0 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
29eb0 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
29ec0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
29ed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
29ee0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
29ef0 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  on */..#ifndef S
29f00 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
29f10 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72  IN.  int iRestor
29f20 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72  eSelectId = pPar
29f30 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20  se->iSelectId;. 
29f40 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
29f50 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65  Id = pParse->iNe
29f60 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65  xtSelectId++;.#e
29f70 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61  ndif..  db = pPa
29f80 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
29f90 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
29fa0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
29fb0 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
29fc0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
29fd0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
29fe0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
29ff0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
2a000 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
2a010 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
2a020 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
2a030 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45  ggInfo));.#if SE
2a040 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2a050 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c  D.  pParse->nSel
2a060 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53  ectIndent++;.  S
2a070 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2a080 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70  rse,p, ("begin p
2a090 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b  rocessing:\n"));
2a0a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2a0b0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2a0c0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2a0d0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2a0e0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2a0f0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
2a100 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2a110 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2a120 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
2a130 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2a140 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2a150 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66  ->eDest!=SRT_Fif
2a160 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
2a170 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2a180 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2a190 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a  RT_DistQueue );.
2a1a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2a1b0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2a1c0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75  t->eDest!=SRT_Qu
2a1d0 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e  eue );.  if( Ign
2a1e0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2a1f0 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
2a200 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
2a210 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
2a220 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a230 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
2a240 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2a250 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
2a260 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2a270 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20  SRT_Discard ||. 
2a280 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2a290 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75  >eDest==SRT_Queu
2a2a0 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  e  || pDest->eDe
2a2b0 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
2a2c0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
2a2d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a2e0 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44  _DistQueue || pD
2a2f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a300 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66  Fifo);.    /* If
2a310 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20   ORDER BY makes 
2a320 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e  no difference in
2a330 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e   the output then
2a340 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20   neither does.  
2a350 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f    ** DISTINCT so
2a360 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76   it can be remov
2a370 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73  ed too. */.    s
2a380 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2a390 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
2a3a0 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  erBy);.    p->pO
2a3b0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2a3c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
2a3d0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
2a3e0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2a3f0 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
2a400 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  0);.  memset(&sS
2a410 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ort, 0, sizeof(s
2a420 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e  Sort));.  sSort.
2a430 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
2a440 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69  rderBy;.  pTabLi
2a450 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2a460 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2a470 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
2a480 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
2a490 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
2a4a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
2a4b0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41  List!=0 );.  isA
2a4c0 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
2a4d0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2a4e0 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54  )!=0;.#if SELECT
2a4f0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2a500 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2a510 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2a520 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2a530 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
2a540 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72  , ("after name r
2a550 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b  esolution:\n"));
2a560 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2a570 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2a580 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2a590 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
2a5a0 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
2a5b0 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
2a5c0 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
2a5d0 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
2a5e0 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69   output..  */.#i
2a5f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a600 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
2a610 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
2a620 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
2a630 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
2a640 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
2a650 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
2a660 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
2a670 64 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f  dif..  /* Try to
2a680 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
2a690 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2a6a0 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74  clause up into t
2a6b0 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20  he main query.  
2a6c0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2a6d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2a6e0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
2a6f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2a700 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
2a710 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
2a720 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2a730 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2a740 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2a750 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2a760 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
2a770 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2a780 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
2a790 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20  t isAggSub;.    
2a7a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
2a7b0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
2a7c0 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
2a7d0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43  tinue;..    /* C
2a7e0 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e  atch mismatch in
2a7f0 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f   the declared co
2a800 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20  lumns of a view 
2a810 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
2a820 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  f.    ** columns
2a830 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f   in the SELECT o
2a840 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20  n the RHS */.   
2a850 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21   if( pTab->nCol!
2a860 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e  =pSub->pEList->n
2a870 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
2a880 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2a890 61 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20  arse, "expected 
2a8a0 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27  %d columns for '
2a8b0 25 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c  %s' but got %d",
2a8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a8d0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
2a8e0 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  l, pTab->zName, 
2a8f0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2a900 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  xpr);.      goto
2a910 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2a920 20 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62   }..    isAggSub
2a930 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61   = (pSub->selFla
2a940 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2a950 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66  e)!=0;.    if( f
2a960 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
2a970 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41  Parse, p, i, isA
2a980 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b  gg, isAggSub) ){
2a990 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
2a9a0 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
2a9b0 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73  bsorbed into its
2a9c0 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
2a9d0 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29    if( isAggSub )
2a9e0 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20  {.        isAgg 
2a9f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
2aa00 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
2aa10 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20  ggregate;.      
2aa20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a  }.      i = -1;.
2aa30 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69      }.    pTabLi
2aa40 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2aa50 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2aa60 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
2aa70 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
2aa80 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
2aa90 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
2aaa0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
2aab0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
2aac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2aad0 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70  if..  /* Get a p
2aae0 6f 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20  ointer the VDBE 
2aaf0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
2ab00 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  on, allocating a
2ab10 20 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65   new VDBE if one
2ab20 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61  .  ** does not a
2ab30 6c 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a  lready exist */.
2ab40 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
2ab50 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
2ab60 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
2ab70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66  select_end;..#if
2ab80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ab90 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
2aba0 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d  .  /* Handle com
2abb0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
2abc0 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68  tements using th
2abd0 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69  e separate multi
2abe0 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72  Select().  ** pr
2abf0 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ocedure..  */.  
2ac00 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
2ac10 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
2ac20 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
2ac30 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70   pDest);.    exp
2ac40 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2ac50 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2ac60 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
2ac70 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  Id);.#if SELECTT
2ac80 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2ac90 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
2aca0 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f  Parse,p,("end co
2acb0 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72  mpound-select pr
2acc0 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20  ocessing\n"));. 
2acd0 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65     pParse->nSele
2ace0 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64  ctIndent--;.#end
2acf0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  if.    return rc
2ad00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2ad10 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2ad20 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
2ad30 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
2ad40 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66   clause.  */.#if
2ad50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2ad60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
2ad70 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
2ad80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
2ad90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
2ada0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
2adb0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2adc0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
2add0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
2ade0 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
2adf0 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
2ae00 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
2ae10 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
2ae20 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
2ae30 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
2ae40 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
2ae50 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
2ae60 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
2ae70 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
2ae80 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
2ae90 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
2aea0 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
2aeb0 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
2aec0 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
2aed0 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
2aee0 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
2aef0 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
2af00 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
2af10 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
2af20 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
2af30 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
2af40 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
2af50 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
2af60 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
2af70 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
2af80 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
2af90 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
2afa0 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
2afb0 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
2afc0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
2afd0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
2afe0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2aff0 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
2b000 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2b010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b020 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
2b030 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
2b040 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2b050 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sub);.      }.  
2b060 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2b070 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
2b080 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
2b090 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
2b0a0 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
2b0b0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
2b0c0 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
2b0d0 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
2b0e0 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
2b0f0 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
2b100 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
2b110 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
2b120 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
2b130 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
2b140 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
2b150 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
2b160 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
2b170 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
2b180 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
2b190 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
2b1a0 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
2b1b0 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
2b1c0 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
2b1d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
2b1e0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
2b1f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2b200 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
2b210 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20   /* Make copies 
2b220 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52  of constant WHER
2b230 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69  E-clause terms i
2b240 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
2b250 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e  y down.    ** in
2b260 73 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72  side the subquer
2b270 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c  y.  This can hel
2b280 70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  p the subquery t
2b290 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63  o run more effic
2b2a0 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  iently..    */. 
2b2b0 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66     if( (pItem->f
2b2c0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
2b2d0 4f 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26  OUTER)==0.     &
2b2e0 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  & pushDownWhereT
2b2f0 65 72 6d 73 28 64 62 2c 20 70 53 75 62 2c 20 70  erms(db, pSub, p
2b300 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
2b310 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b  >iCursor).    ){
2b320 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2b330 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69  _ENABLED.      i
2b340 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2b350 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2b360 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54  .        SELECTT
2b370 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2b380 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52  e,p,("After WHER
2b390 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f  E-clause push-do
2b3a0 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  wn:\n"));.      
2b3b0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2b3c0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2b3d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2b3e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
2b3f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
2b400 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75  implement the su
2b410 62 71 75 65 72 79 0a 20 20 20 20 2a 2f 0a 20 20  bquery.    */.  
2b420 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
2b430 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 26 26 20  nSrc==1.     && 
2b440 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2b450 46 5f 41 6c 6c 29 3d 3d 30 0a 20 20 20 20 20 26  F_All)==0.     &
2b460 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2b470 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2b480 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a  _SubqCoroutine).
2b490 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2b4a0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72  Implement a co-r
2b4b0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
2b4c0 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   return a single
2b4d0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
2b4e0 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  lt.      ** set 
2b4f0 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69  on each invocati
2b500 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
2b510 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d     int addrTop =
2b520 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2b530 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20  entAddr(v)+1;.  
2b540 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2b550 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
2b560 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2b570 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2b580 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
2b590 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2b5a0 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70  turn, 0, addrTop
2b5b0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2b5c0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
2b5d0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2b5e0 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  e));.      pItem
2b5f0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2b600 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73  addrTop;.      s
2b610 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
2b620 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
2b630 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
2b640 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2b650 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2b660 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2b670 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2b680 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2b690 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2b6a0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2b6b0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2b6c0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2b6d0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
2b6e0 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62  lite3LogEst(pSub
2b6f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
2b700 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76       pItem->fg.v
2b710 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
2b720 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2b730 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
2b740 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
2b750 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2b760 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
2b770 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2b780 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
2b790 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2b7a0 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
2b7b0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2b7c0 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2b7d0 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
2b7e0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2b7f0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2b800 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
2b810 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
2b820 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
2b830 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2b840 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
2b850 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2b860 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
2b870 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
2b880 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
2b890 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
2b8a0 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
2b8b0 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
2b8c0 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
2b8d0 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
2b8e0 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
2b8f0 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
2b900 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
2b910 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
2b920 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
2b930 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
2b940 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2b950 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2b960 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ub==0 );.      p
2b970 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
2b980 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2b990 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20  ;.      topAddr 
2b9a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2b9b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2b9c0 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67  r, 0, pItem->reg
2b9d0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70  Return);.      p
2b9e0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2b9f0 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20  b = topAddr+1;. 
2ba00 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2ba10 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d  fg.isCorrelated=
2ba20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
2ba30 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
2ba40 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74   is not correlat
2ba50 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65  ed and if we are
2ba60 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20   not inside of. 
2ba70 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
2ba80 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c  ger, then we onl
2ba90 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  y need to comput
2baa0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2bab0 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
2bac0 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a      ** once. */.
2bad0 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72          onceAddr
2bae0 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
2baf0 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
2bb00 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2bb10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2bb20 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
2bb30 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
2bb40 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2bb50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2bb60 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
2bb70 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
2bb80 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
2bb90 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2bba0 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
2bbb0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2bbc0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
2bbd0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
2bbe0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2bbf0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2bc00 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2bc10 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2bc20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2bc30 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
2bc40 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
2bc50 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
2bc60 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
2bc70 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2bc80 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53  sqlite3LogEst(pS
2bc90 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  ub->nSelectRow);
2bca0 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41  .      if( onceA
2bcb0 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  ddr ) sqlite3Vdb
2bcc0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63  eJumpHere(v, onc
2bcd0 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65  eAddr);.      re
2bce0 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
2bcf0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2bd00 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72  Return, pItem->r
2bd10 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2bd20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2bd30 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d   "end %s", pItem
2bd40 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2bd50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2bd60 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f  beChangeP1(v, to
2bd70 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b  pAddr, retAddr);
2bd80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
2bd90 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
2bda0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
2bdb0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2bdc0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2bdd0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70  elect_end;.    p
2bde0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
2bdf0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
2be00 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
2be10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56  }.#endif..  /* V
2be20 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20  arious elements 
2be30 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f  of the SELECT co
2be40 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20  pied into local 
2be50 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20  variables for.  
2be60 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a  ** convenience *
2be70 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
2be80 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65  pEList;.  pWhere
2be90 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
2bea0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
2beb0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
2bec0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
2bed0 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
2bee0 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
2bef0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
2bf00 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  !=0;..#if SELECT
2bf10 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2bf20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2bf30 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
2bf40 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2bf50 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
2bf60 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f  ,("After all FRO
2bf70 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69  M-clause analysi
2bf80 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  s:\n"));.    sql
2bf90 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2bfa0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2bfb0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2bfc0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
2bfd0 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
2bfe0 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
2bff0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
2c000 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
2c010 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
2c020 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2c030 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
2c040 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
2c050 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
2c060 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
2c070 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
2c080 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
2c090 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2c0a0 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
2c0b0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
2c0c0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
2c0d0 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
2c0e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2c0f0 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
2c100 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
2c110 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2c120 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
2c130 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
2c140 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
2c150 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
2c160 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
2c170 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
2c180 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
2c190 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
2c1a0 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
2c1b0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
2c1c0 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
2c1d0 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
2c1e0 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
2c1f0 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
2c200 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
2c210 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
2c220 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
2c230 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
2c240 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
2c250 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
2c260 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
2c270 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
2c280 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
2c290 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
2c2a0 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
2c2b0 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
2c2c0 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
2c2d0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2c2e0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2c2f0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
2c300 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
2c310 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2c320 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
2c330 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
2c340 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
2c350 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
2c360 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
2c370 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
2c380 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
2c390 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
2c3a0 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
2c3b0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
2c3c0 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
2c3d0 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
2c3e0 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
2c3f0 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
2c400 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
2c410 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
2c420 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2c430 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2c440 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
2c450 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2c460 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65  n create an ephe
2c470 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20  meral index to. 
2c480 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69   ** do the sorti
2c490 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f  ng.  But this so
2c4a0 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20  rting ephemeral 
2c4b0 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
2c4c0 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e  up.  ** being un
2c4d0 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
2c4e0 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65   can be extracte
2c4f0 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20  d in pre-sorted 
2c500 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74  order..  ** If t
2c510 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
2c520 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65   then the OP_Ope
2c530 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
2c540 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20  uction will be. 
2c550 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61   ** changed to a
2c560 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77  n OP_Noop once w
2c570 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
2c580 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
2c590 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  dex is.  ** not 
2c5a0 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f  needed.  The sSo
2c5b0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2c5c0 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
2c5d0 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a  d to facilitate.
2c5e0 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65    ** that change
2c5f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f  ..  */.  if( sSo
2c600 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
2c610 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2c620 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Info;.    pKeyIn
2c630 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2c640 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2c650 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
2c660 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   0, pEList->nExp
2c670 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45  r);.    sSort.iE
2c680 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
2c690 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f  >nTab++;.    sSo
2c6a0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2c6b0 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
2c6c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2c6d0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
2c6e0 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e            sSort.
2c6f0 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e  iECursor, sSort.
2c700 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
2c710 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  1+pEList->nExpr,
2c720 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63   0,.          (c
2c730 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2c740 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20  4_KEYINFO.      
2c750 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c760 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2c770 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
2c780 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
2c790 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
2c7a0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
2c7b0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
2c7c0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
2c7d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2c7e0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
2c7f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c800 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
2c810 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
2c820 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74  >iSDParm, pEList
2c830 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
2c840 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
2c850 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
2c860 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2c870 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d  keLabel(v);.  p-
2c880 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41  >nSelectRow = LA
2c890 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63  RGEST_INT64;.  c
2c8a0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
2c8b0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
2c8c0 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
2c8d0 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
2c8e0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2c8f0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
2c900 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
2c910 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  de(v, sSort.addr
2c920 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f  SortIndex, OP_So
2c930 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73  rterOpen);.    s
2c940 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
2c950 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
2c960 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
2c970 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  Open an ephemera
2c980 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
2c990 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
2c9a0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
2c9b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2c9c0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2c9d0 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
2c9e0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2c9f0 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
2ca00 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
2ca10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2ca20 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2ca30 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
2ca60 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
2ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca80 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
2ca90 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2caa0 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
2cab0 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
2cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cad0 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
2cae0 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
2caf0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2cb00 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
2cb10 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
2cb20 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2cb30 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
2cb40 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERED;.  }else{. 
2cb50 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2cb60 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
2cb70 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
2cb80 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  }..  if( !isAgg 
2cb90 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
2cba0 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72  {.    /* No aggr
2cbb0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2cbc0 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
2cbd0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31  clause */.    u1
2cbe0 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  6 wctrlFlags = (
2cbf0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2cc00 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   ? WHERE_WANT_DI
2cc10 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20  STINCT : 0);..  
2cc20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
2cc30 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f  atabase scan. */
2cc40 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
2cc50 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2cc60 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2cc70 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e  , pWhere, sSort.
2cc80 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cca0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
2ccb0 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  st, wctrlFlags, 
2ccc0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  0);.    if( pWIn
2ccd0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
2cce0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2ccf0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
2cd00 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
2cd10 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
2cd20 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
2cd30 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
2cd40 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
2cd50 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
2cd60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2cd70 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2cd80 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
2cd90 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2cda0 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
2cdb0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2cdc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
2cdd0 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
2cde0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2cdf0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
2ce00 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
2ce10 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
2ce20 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2ce30 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  fo);.      if( s
2ce40 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f  Sort.nOBSat==sSo
2ce50 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  rt.pOrderBy->nEx
2ce60 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53  pr ){.        sS
2ce70 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
2ce80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ce90 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
2cea0 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
2ceb0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
2cec0 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
2ced0 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
2cee0 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
2cef0 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
2cf00 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
2cf10 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
2cf20 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
2cf30 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
2cf40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f    */.    if( sSo
2cf50 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2cf60 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72  >=0 && sSort.pOr
2cf70 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
2cf80 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2cf90 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
2cfa0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2cfb0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
2cfc0 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
2cfd0 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f  d inner loop. */
2cfe0 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  .    selectInner
2cff0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
2d000 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f  pEList, -1, &sSo
2d010 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20  rt, &sDistinct, 
2d020 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
2d030 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2d040 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c  e3WhereContinueL
2d050 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20  abel(pWInfo),.  
2d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d070 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72    sqlite3WhereBr
2d080 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
2d090 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74  );..    /* End t
2d0a0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
2d0b0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
2d0c0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2d0d0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
2d0e0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
2d0f0 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20  case when there 
2d100 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20  exist aggregate 
2d110 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47  functions or a G
2d120 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20  ROUP BY clause. 
2d130 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f     ** or both */
2d140 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
2d150 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
2d160 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
2d170 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
2d180 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
2d190 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
2d1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2d1b0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
2d1c0 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
2d1d0 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
2d1e0 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
2d1f0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
2d200 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
2d210 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
2d220 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
2d230 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
2d240 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
2d250 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
2d260 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
2d270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d280 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
2d290 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
2d2a0 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
2d2b0 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2d0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
2d2e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
2d2f0 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
2d300 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
2d310 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
2d320 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
2d330 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
2d340 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
2d350 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
2d360 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
2d370 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
2d380 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
2d390 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
2d3a0 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
2d3b0 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  ELECT */.    int
2d3c0 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20   sortPTab = 0;  
2d3d0 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20   /* Pseudotable 
2d3e0 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73  used to decode s
2d3f0 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  orting results *
2d400 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75  /.    int sortOu
2d410 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74  t = 0;    /* Out
2d420 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f  put register fro
2d430 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  m the sorter */.
2d440 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47      int orderByG
2d450 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  rp = 0; /* True 
2d460 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  if the GROUP BY 
2d470 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65  and ORDER BY are
2d480 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20   the same */..  
2d490 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
2d4a0 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
2d4b0 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
2d4c0 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
2d4d0 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
2d4e0 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
2d4f0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
2d500 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
2d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d520 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2d530 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
2d540 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2d550 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
2d560 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2d570 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
2d580 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
2d590 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
2d5a0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
2d5b0 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
2d5c0 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
2d5d0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
2d5e0 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
2d5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
2d600 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
2d610 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
2d620 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
2d630 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2d640 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
2d650 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
2d660 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
2d670 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20  SelectRow>100 ) 
2d680 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2d690 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  100;.    }else{.
2d6a0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
2d6b0 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Row = 1;.    }..
2d6c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2d6d0 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
2d6e0 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
2d6f0 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
2d700 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64  ey are.    ** id
2d710 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74  entical, then it
2d720 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65   may be possible
2d730 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
2d740 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2d750 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67  .    ** on the g
2d760 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20  rounds that the 
2d770 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61  GROUP BY will ca
2d780 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20  use elements to 
2d790 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a  come out .    **
2d7a0 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
2d7b0 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d  order. It also m
2d7c0 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f  ay not - the GRO
2d7d0 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20  UP BY might use 
2d7e0 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  a.    ** databas
2d7f0 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75  e index that cau
2d800 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67  ses rows to be g
2d810 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20  rouped together 
2d820 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  as required.    
2d830 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61  ** but not actua
2d840 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68  lly sorted. Eith
2d850 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74  er way, record t
2d860 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
2d870 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  .    ** ORDER BY
2d880 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c   and GROUP BY cl
2d890 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61  auses are the sa
2d8a0 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  me by setting th
2d8b0 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20  e orderByGrp.   
2d8c0 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a   ** variable.  *
2d8d0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
2d8e0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
2d8f0 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74  (pGroupBy, sSort
2d900 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d  .pOrderBy, -1)==
2d910 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  0 ){.      order
2d920 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d  ByGrp = 1;.    }
2d930 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
2d940 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
2d950 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
2d960 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
2d970 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
2d980 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
2d990 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
2d9a0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
2d9b0 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
2d9c0 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
2d9d0 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
2d9e0 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
2d9f0 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
2da00 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
2da10 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
2da20 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
2da30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2da40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
2da50 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
2da60 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
2da70 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
2da80 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
2da90 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
2daa0 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
2dab0 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
2dac0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65     sAggInfo.mnRe
2dad0 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
2dae0 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  +1;.    sAggInfo
2daf0 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
2db00 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
2db10 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  oupBy->nExpr : 0
2db20 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70  ;.    sAggInfo.p
2db30 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
2db40 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  By;.    sqlite3E
2db50 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2db60 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b  t(&sNC, pEList);
2db70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2db80 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
2db90 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sNC, sSort.pOrde
2dba0 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48  rBy);.    if( pH
2dbb0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  aving ){.      s
2dbc0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2dbd0 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
2dbe0 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  , pHaving);.    
2dbf0 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
2dc00 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
2dc10 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
2dc20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2dc30 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
2dc40 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2dc50 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2dc60 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  rty(sAggInfo.aFu
2dc70 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  nc[i].pExpr, EP_
2dc80 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2dc90 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
2dca0 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
2dcb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2dcc0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2dcd0 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
2dce0 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
2dcf0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
2dd00 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
2dd10 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
2dd20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2dd30 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mxReg = pParse-
2dd40 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64  >nMem;.    if( d
2dd50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2dd60 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2dd70 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
2dd80 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
2dd90 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
2dda0 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
2ddb0 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
2ddc0 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
2ddd0 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
2dde0 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
2ddf0 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
2de00 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
2de10 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
2de20 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
2de30 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
2de40 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
2de50 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  y clause */.    
2de60 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
2de70 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20        /* A-vs-B 
2de80 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70  comparision jump
2de90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2dea0 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a  drOutputRow;  /*
2deb0 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
2dec0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
2ded0 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
2dee0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  /.      int regO
2def0 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52  utputRow;   /* R
2df00 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
2df10 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75  gister for outpu
2df20 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
2df30 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
2df40 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74  tAbort;   /* Set
2df50 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
2df60 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2df70 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
2df80 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f  fLoop;  /* Top o
2df90 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
2dfa0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2dfb0 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a  drSortingIdx; /*
2dfc0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
2dfd0 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
2dfe0 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
2dff0 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73       int addrRes
2e000 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72  et;      /* Subr
2e010 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
2e020 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
2e030 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ator */.      in
2e040 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
2e050 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
2e060 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
2e070 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
2e080 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  e */..      /* I
2e090 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
2e0a0 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
2e0b0 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
2e0c0 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
2e0d0 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
2e0e0 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
2e0f0 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
2e100 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
2e110 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
2e120 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
2e130 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
2e140 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  l, the OP_Sorter
2e150 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  Open instruction
2e160 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
2e170 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
2e180 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
2e190 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
2e1a0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
2e1b0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2e1c0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
2e1d0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2e1e0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
2e1f0 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e  oupBy, 0, sAggIn
2e200 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  fo.nColumn);.   
2e210 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
2e220 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
2e230 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
2e240 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20  erOpen, .       
2e250 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
2e260 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f  ingIdx, sAggInfo
2e270 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
2e280 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28   .          0, (
2e290 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
2e2a0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
2e2b0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
2e2c0 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
2e2d0 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
2e2e0 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
2e2f0 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
2e300 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
2e310 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2e320 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
2e330 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2e340 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
2e350 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
2e360 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2e370 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
2e380 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2e390 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
2e3a0 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
2e3b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2e3c0 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
2e3d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2e3e0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
2e3f0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
2e400 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
2e410 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
2e420 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2e430 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
2e440 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
2e450 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
2e460 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
2e470 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
2e480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e490 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
2e4a0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
2e4b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2e4c0 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
2e4d0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
2e4e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2e4f0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2e500 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
2e510 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2e520 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
2e530 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
2e540 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e550 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2e560 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
2e570 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
2e580 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
2e590 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
2e5a0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
2e5b0 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
2e5c0 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
2e5d0 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
2e5e0 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
2e5f0 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
2e600 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
2e610 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
2e620 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
2e630 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
2e640 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
2e650 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
2e660 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
2e670 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
2e680 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
2e690 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
2e6a0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2e6b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2e6c0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
2e6d0 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
2e6e0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
2e6f0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2e700 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2e710 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75  t, pWhere, pGrou
2e720 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBy, 0,.        
2e730 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20    WHERE_GROUPBY 
2e740 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20  | (orderByGrp ? 
2e750 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
2e760 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20  P : 0), 0.      
2e770 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
2e780 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
2e790 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
2e7a0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2e7b0 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
2e7c0 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  )==pGroupBy->nEx
2e7d0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pr ){.        /*
2e7e0 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
2e7f0 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
2e800 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
2e810 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
2e820 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
2e830 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
2e840 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
2e850 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
2e860 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
2e870 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
2e880 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
2e890 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
2e8a0 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
2e8b0 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
2e8c0 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
2e8d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e8e0 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
2e8f0 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
2e900 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
2e910 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
2e920 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
2e930 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
2e940 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
2e950 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
2e960 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
2e970 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
2e980 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2e990 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
2e9a0 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
2e9b0 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
2e9c0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
2e9d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
2e9e0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
2e9f0 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
2ea00 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
2ea10 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
2ea20 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
2ea30 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
2ea40 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
2ea50 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
2ea60 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
2ea70 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
2ea80 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
2ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
2eaa0 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
2eab0 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
2eac0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
2ead0 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
2eae0 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
2eaf0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
2eb00 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  l = nGroupBy;.  
2eb10 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
2eb20 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
2eb30 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
2eb40 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2eb50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
2eb60 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
2eb70 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
2eb80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
2eb90 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
2eba0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
2ebb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2ebc0 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
2ebd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2ebe0 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
2ebf0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ec00 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2ec10 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
2ec20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2ec30 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2ec40 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
2ec50 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
2ec60 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
2ec70 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2ec80 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
2ec90 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2eca0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2ecb0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
2ecc0 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
2ecd0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
2ece0 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
2ecf0 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
2ed00 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
2ed10 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
2ed20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
2ed30 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
2ed40 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
2ed50 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
2ed60 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
2ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed80 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
2ed90 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
2eda0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
2edb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2edc0 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a    if( r1!=r2 ){.
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2ede0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2edf0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c  v, OP_SCopy, r2,
2ee00 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
2ee10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ee20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
2ee30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ee40 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
2ee50 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2ee60 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2ee70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ee80 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
2ee90 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
2eea0 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
2eeb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2eec0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2eed0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
2eee0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2eef0 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
2ef00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
2ef10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
2ef20 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
2ef30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ef40 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2ef50 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
2ef60 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2ef70 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2ef80 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2ef90 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
2efa0 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
2efb0 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
2efc0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
2efd0 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
2efe0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2eff0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2f000 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f010 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
2f020 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
2f030 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
2f040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f050 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2f060 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
2f070 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
2f080 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
2f090 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
2f0a0 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
2f0b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2f0c0 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
2f0d0 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
2f0e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
2f0f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2f100 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ear(pParse);..  
2f110 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2f120 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20  If the index or 
2f130 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
2f140 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55  used by the GROU
2f150 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20  P BY sort.      
2f160 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c  ** will naturall
2f170 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  y deliver rows i
2f180 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75  n the order requ
2f190 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  ired by the ORDE
2f1a0 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c  R BY.      ** cl
2f1b0 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65  ause, cancel the
2f1c0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2f1d0 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c   open coded earl
2f1e0 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ier..      **.  
2f1f0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
2f200 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
2f210 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
2f220 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c  wer should resul
2f230 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  t regardless..  
2f240 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53      ** Use the S
2f250 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
2f260 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
2f270 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2f280 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20  IMIZER to .     
2f290 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73   ** disable this
2f2a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
2f2b0 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
2f2c0 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  es.  */.      if
2f2d0 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20  ( orderByGrp && 
2f2e0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2f2f0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47  led(db, SQLITE_G
2f300 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20  roupByOrder) .  
2f310 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79       && (groupBy
2f320 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57  Sort || sqlite3W
2f330 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49  hereIsSorted(pWI
2f340 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20  nfo)).      ){. 
2f350 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
2f360 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2f370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2f380 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2f390 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2f3a0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
2f3b0 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
2f3c0 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
2f3d0 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
2f3e0 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
2f3f0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
2f400 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
2f410 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
2f420 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
2f430 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
2f440 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
2f450 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2f460 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
2f470 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
2f480 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
2f490 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
2f4a0 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
2f4b0 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
2f4c0 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
2f4d0 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
2f4e0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
2f4f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2f500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2f510 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2f520 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
2f530 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2f540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f550 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2f560 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67  SorterData, sAgg
2f570 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2f580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f590 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f             sortO
2f5a0 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20  ut, sortPTab);. 
2f5b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
2f5c0 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
2f5d0 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
2f5e0 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
2f5f0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2f600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f610 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
2f620 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c  mn, sortPTab, j,
2f630 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
2f640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f650 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
2f660 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
2f670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2f680 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2f690 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
2f6a0 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
2f6b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f6c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f6d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
2f6e0 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69  ompare, iAMem, i
2f6f0 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  BMem, pGroupBy->
2f700 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
2f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f720 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
2f730 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
2f740 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
2f750 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c  ;.      j1 = sql
2f760 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2f770 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2f780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2f790 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31  v, OP_Jump, j1+1
2f7a0 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56 64 62 65  , 0, j1+1); Vdbe
2f7b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
2f7c0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2f7d0 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
2f7e0 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
2f7f0 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
2f800 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69      ** Changes i
2f810 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
2f820 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
2f830 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
2f840 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
2f850 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
2f860 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
2f870 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
2f880 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
2f890 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
2f8a0 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
2f8b0 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
2f8c0 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
2f8d0 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
2f8e0 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
2f8f0 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
2f900 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
2f910 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
2f920 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
2f930 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
2f940 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
2f950 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
2f960 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
2f970 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
2f980 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2f990 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
2f9a0 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65  rse, iBMem, iAMe
2f9b0 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
2f9c0 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
2f9d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f9e0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
2f9f0 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
2fa00 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
2fa10 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
2fa20 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
2fa30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2fa40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2fa50 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  IfPos, iAbortFla
2fa60 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62  g, addrEnd); Vdb
2fa70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2fa80 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2fa90 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
2faa0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2fab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fac0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2fad0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
2fae0 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
2faf0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
2fb00 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
2fb10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
2fb20 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
2fb30 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
2fb40 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
2fb50 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
2fb60 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
2fb70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2fb80 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2fb90 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
2fba0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
2fbb0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
2fbc0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
2fbd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fbe0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
2fbf0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
2fc00 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2fc10 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
2fc20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
2fc30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
2fc40 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
2fc50 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2fc60 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2fc70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2fc80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2fc90 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49  orterNext, sAggI
2fca0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2fcb0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a  addrTopOfLoop);.
2fcc0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2fcd0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
2fce0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2fcf0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2fd00 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
2fd10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2fd20 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
2fd30 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20  rtingIdx);.     
2fd40 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
2fd50 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
2fd60 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
2fd70 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2fd80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2fd90 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
2fda0 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
2fdb0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
2fdc0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
2fdd0 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22  utput final row"
2fde0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  ));..      /* Ju
2fdf0 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72  mp over the subr
2fe00 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f  outines.      */
2fe10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fe20 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e  beGoto(v, addrEn
2fe30 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
2fe40 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2fe50 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
2fe60 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2fe70 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2fe80 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
2fe90 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
2fea0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
2feb0 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
2fec0 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
2fed0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2fee0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
2fef0 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
2ff00 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
2ff10 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
2ff20 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
2ff30 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
2ff40 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
2ff50 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
2ff60 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
2ff70 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
2ff80 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
2ff90 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
2ffa0 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
2ffb0 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
2ffc0 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
2ffd0 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
2ffe0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
2fff0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
30000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30010 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
30020 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
30030 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
30040 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
30050 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
30060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30070 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
30080 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
30090 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
300a0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
300b0 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
300c0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
300d0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
300e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
300f0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
30100 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30110 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
30120 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
30130 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
30140 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
30150 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
30160 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
30170 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
30180 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
30190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
301a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
301b0 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
301c0 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
301d0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
301e0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
301f0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
30200 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
30210 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
30220 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
30230 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
30240 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
30250 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
30260 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
30270 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20  1, &sSort,.     
30280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30290 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
302a0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
302b0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
302c0 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
302d0 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
302e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
302f0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
30300 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
30310 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
30320 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
30330 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
30340 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
30350 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
30360 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
30370 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
30380 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
30390 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
303a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
303b0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
303c0 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
303d0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
303e0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
303f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30400 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
30410 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
30420 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
30430 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
30440 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
30450 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
30460 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
30470 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
30480 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
30490 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
304a0 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
304b0 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
304c0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
304d0 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
304e0 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
304f0 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
30500 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
30510 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
30520 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
30530 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
30540 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
30550 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
30560 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
30570 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
30580 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
30590 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
305a0 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
305b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
305c0 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
305d0 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
305e0 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
305f0 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
30600 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
30610 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
30620 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
30630 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
30640 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
30650 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
30660 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
30670 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
30680 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
30690 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
306a0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
306b0 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
306c0 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
306d0 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
306e0 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
306f0 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
30700 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
30710 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
30720 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
30730 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
30740 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
30750 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
30760 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
30770 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
30780 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
30790 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
307a0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
307b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
307c0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
307d0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
307e0 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
307f0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
30800 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
30810 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
30820 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30840 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
30850 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
30860 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
30870 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
30880 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
30890 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
308a0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
308b0 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
308c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
308d0 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
308e0 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
308f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
30900 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
30910 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
30920 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
30930 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
30940 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
30950 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
30960 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
30970 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30980 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
30990 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
309a0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
309b0 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
309c0 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
309d0 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
309e0 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f  e lowest scan co
309f0 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st..        **. 
30a00 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d         ** (2011-
30a10 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f  04-15) Do not do
30a20 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20   a full scan of 
30a30 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64  an unordered ind
30a40 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
30a50 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d         ** (2013-
30a60 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f  10-03) Do not co
30a70 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20  unt the entries 
30a80 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  in a partial ind
30a90 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
30aa0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61         ** In pra
30ab0 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66  ctice the KeyInf
30ac0 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c  o structure will
30ad0 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74   not be used. It
30ae0 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20   is only .      
30af0 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b    ** passed to k
30b00 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  eep OP_OpenRead 
30b10 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a  happy..        *
30b20 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48  /.        if( !H
30b30 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
30b40 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pBest = sqlite3P
30b50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
30b60 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  Tab);.        fo
30b70 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
30b80 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
30b90 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
30ba0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
30bb0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
30bc0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
30bd0 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  dx->szIdxRow<pTa
30be0 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20  b->szTabRow.    
30bf0 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
30c00 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
30c10 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
30c20 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e  !pBest || pIdx->
30c30 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e  szIdxRow<pBest->
30c40 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20  szIdxRow).      
30c50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
30c60 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
30c70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
30c90 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
30ca0 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42        iRoot = pB
30cb0 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  est->tnum;.     
30cc0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
30cd0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
30ce0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42  Index(pParse, pB
30cf0 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
30d00 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
30d10 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
30d20 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
30d30 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
30d40 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
30d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30d60 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
30d70 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
30d80 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31  r, iRoot, iDb, 1
30d90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
30da0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
30db0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30dc0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
30dd0 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
30de0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
30df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30e10 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
30e20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61  iCsr, sAggInfo.a
30e30 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20  Func[0].iMem);. 
30e40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30e50 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
30e60 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20  lose, iCsr);.   
30e70 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70       explainSimp
30e80 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20  leCount(pParse, 
30e90 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20  pTab, pBest);.  
30ea0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
30eb0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
30ec0 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
30ed0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
30ee0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75   Check if the qu
30ef0 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ery is of one of
30f00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
30f10 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  orms:.        **
30f20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
30f30 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d  LECT min(x) FROM
30f40 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20   ....        ** 
30f50 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20    SELECT max(x) 
30f60 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
30f70 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
30f80 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73  f it is, then as
30f90 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68  k the code in wh
30fa0 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74  ere.c to attempt
30fb0 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73   to sort results
30fc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69  .        ** as i
30fd0 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22  f there was an "
30fe0 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22  ORDER ON x" or "
30ff0 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22  ORDER ON x DESC"
31000 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20   clause. .      
31010 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20    ** If where.c 
31020 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75  is able to produ
31030 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65  ce results sorte
31040 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c  d in this order,
31050 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
31060 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74   add vdbe code t
31070 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
31080 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  he processing lo
31090 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20  op after the .  
310a0 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69        ** first i
310b0 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20  teration (since 
310c0 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
310d0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
310e0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  is .        ** g
310f0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65  uaranteed to ope
31100 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20  rate on the row 
31110 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d  with the minimum
31120 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20   or maximum .   
31130 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
31140 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77   x, the only row
31150 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20   required)..    
31160 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31170 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67  * A special flag
31180 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
31190 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
311a0 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74  egin() to slight
311b0 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ly.        ** mo
311c0 64 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73  dify behavior as
311d0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
311e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
311f0 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79    + If the query
31200 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69   is a "SELECT mi
31210 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20  n(x)", then the 
31220 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20  loop coded by.  
31230 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65        **     whe
31240 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20  re.c should not 
31250 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79  iterate over any
31260 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e   values with a N
31270 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ULL value.      
31280 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a    **     for x..
31290 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
312a0 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70     **   + The op
312b0 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20  timizer code in 
312c0 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69  where.c (the thi
312d0 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20  ng that decides 
312e0 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
312f0 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e       index or in
31300 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68  dices to use) sh
31310 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66  ould place a dif
31320 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20  ferent priority 
31330 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  on .        **  
31340 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68     satisfying th
31350 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61  e 'ORDER BY' cla
31360 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73  use than it does
31370 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e   in other cases.
31380 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
31390 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e  Refer to code an
313a0 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68  d comments in wh
313b0 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c  ere.c for detail
313c0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
313d0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
313e0 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20  pMinMax = 0;.   
313f0 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57       u8 flag = W
31400 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
31410 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  MAL;.        .  
31420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
31430 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
31440 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31450 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flag==0 );.     
31460 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e     if( p->pHavin
31470 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
31480 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51    flag = minMaxQ
31490 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20  uery(&sAggInfo, 
314a0 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20  &pMinMax);.     
314b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
314c0 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20  ert( flag==0 || 
314d0 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70  (pMinMax!=0 && p
314e0 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
314f0 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ) );..        if
31500 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
31510 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71      pMinMax = sq
31520 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
31530 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29  (db, pMinMax, 0)
31540 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  ;.          pDel
31550 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20   = pMinMax;.    
31560 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61        if( pMinMa
31570 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
31580 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
31590 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
315a0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
315b0 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
315c0 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20  RBY_MIN ?1:0;.  
315d0 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
315e0 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  x->a[0].pExpr->o
315f0 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
31600 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31610 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
31620 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
31630 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
31640 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
31650 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
31660 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
31670 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
31680 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
31690 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
316a0 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a  le row.        *
316b0 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
316c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
316d0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
316e0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
316f0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49  fo);.        pWI
31700 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
31710 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
31720 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
31730 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67  , pMinMax,0,flag
31740 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
31750 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20   pWInfo==0 ){.  
31760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
31770 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
31780 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pDel);.       
31790 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
317a0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
317b0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
317c0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
317d0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
317e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e      assert( pMin
317f0 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61  Max==0 || pMinMa
31800 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  x->nExpr==1 );. 
31810 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
31820 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
31830 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20  (pWInfo)>0 ){.  
31840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
31850 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74  dbeGoto(v, sqlit
31860 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
31870 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20  l(pWInfo));.    
31880 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
31890 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
318a0 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20  ndex",.         
318b0 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48         (flag==WH
318c0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ERE_ORDERBY_MIN?
318d0 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
318e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
318f0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
31900 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
31910 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
31920 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
31930 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
31940 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74    }..      sSort
31950 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
31960 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
31970 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
31980 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
31990 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
319a0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
319b0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
319c0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
319d0 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20  , -1, 0, 0, .   
319e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319f0 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
31a00 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
31a10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
31a20 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
31a30 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
31a40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
31a50 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
31a60 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
31a70 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
31a80 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73  uery */..  if( s
31a90 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
31aa0 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  pe==WHERE_DISTIN
31ab0 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a  CT_UNORDERED ){.
31ac0 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
31ad0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49  able(pParse, "DI
31ae0 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20  STINCT");.  }.. 
31af0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
31b00 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
31b10 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
31b20 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
31b30 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
31b40 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
31b50 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
31b60 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
31b70 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
31b80 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
31b90 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20  Table(pParse,.  
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bb0 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e     sSort.nOBSat>
31bc0 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20  0 ? "RIGHT PART 
31bd0 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52  OF ORDER BY":"OR
31be0 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65  DER BY");.    ge
31bf0 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
31c00 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74  Parse, p, &sSort
31c10 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
31c20 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
31c30 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
31c40 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
31c50 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
31c60 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
31c70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
31c80 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
31c90 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65  en coded. If the
31ca0 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  re is an error i
31cb0 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75  n the Parse stru
31cc0 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20  cture,.  ** set 
31cd0 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
31ce0 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20  to 1. Otherwise 
31cf0 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50  0. */.  rc = (pP
31d00 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a  arse->nErr>0);..
31d10 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
31d20 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
31d30 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
31d40 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
31d50 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
31d60 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
31d70 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
31d80 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
31d90 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
31da0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
31db0 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
31dc0 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
31dd0 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
31de0 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
31df0 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
31e00 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
31e10 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
31e20 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
31e30 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
31e40 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
31e50 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
31e60 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
31e70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
31e80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
31e90 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
31ea0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
31eb0 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
31ec0 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  unc);.#if SELECT
31ed0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31ee0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
31ef0 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f  arse,p,("end pro
31f00 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
31f10 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
31f20 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a  ndent--;.#endif.
31f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.