/ Hex Artifact Content
Login

Artifact 57ef3d98c4400b93eea318813be41b2af2da2217:


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 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
34c0: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
34d0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
34e0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
34f0: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
3500: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
3510: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
3520: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
3530: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
3540: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
3550: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3560: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
3570: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
3580: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3590: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
35a0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
35b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
35c0: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
35d0: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
35e0: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
35f0: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
3600: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
3610: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
3630: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
3640: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
3650: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3660: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
3670: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
3680: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
3690: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
36a0: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
36b0: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
36c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
36d0: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
36e0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
36f0: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
3700: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3710: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
3720: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3730: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
3740: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3750: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3760: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
3770: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
3780: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3790: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
37a0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, i+1, j,.
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
37d0: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
37e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
3800: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
3810: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3820: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
3830: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3840: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
3850: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3860: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3870: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3880: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
3890: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
38a0: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
38b0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
38c0: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
38d0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
38e0: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
38f0: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
3900: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3910: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
3920: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
3930: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
3940: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3950: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
3960: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
3970: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
3980: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
3990: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
39a0: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
39b0: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
39c0: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
39d0: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
39e0: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
39f0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3a00: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
3a10: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
3a20: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
3a30: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
3a40: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
3a50: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
3a60: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
3a70: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3a80: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
3a90: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
3aa0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
3ab0: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
3ac0: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
3ad0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
3ae0: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
3af0: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
3b00: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
3b10: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
3b20: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
3b30: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
3b40: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3b50: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
3b60: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
3b70: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3b80: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
3b90: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
3ba0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
3bb0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
3bc0: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
3bd0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
3be0: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
3bf0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
3c00: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
3c10: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
3c20: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3c30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3c40: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
3c50: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
3c60: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
3c70: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
3c80: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3c90: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
3ca0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3cb0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3cc0: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
3cd0: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
3ce0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3cf0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3d00: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
3d10: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
3d20: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
3d30: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3d40: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
3d50: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
3d60: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
3d70: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
3d80: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
3d90: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
3da0: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3db0: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3dc0: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
3dd0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3de0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3df0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3e00: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
3e10: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
3e30: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
3e40: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
3e50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
3e60: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
3e70: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
3e80: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3e90: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3ea0: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
3eb0: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
3ec0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3ed0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3ee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3ef0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3f00: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
3f10: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
3f20: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
3f30: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
3f40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3f50: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3f60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3f70: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
3f80: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
3f90: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
3fa0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
3fb0: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
3fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
3fd0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
3fe0: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
3ff0: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
4000: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
4010: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
4020: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
4030: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65   */.);../*.** Ge
4040: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
4050: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
4060: 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65  ecord in registe
4070: 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68  rs regData.** th
4080: 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44  rough regData+nD
4090: 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73  ata-1 onto the s
40a0: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
40b0: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
40c0: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
40d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
40e0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
40f0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
4100: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  Sort,        /* 
4110: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4120: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  t the ORDER BY c
4130: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
4140: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
4150: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
4160: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
4170: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
4180: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
4190: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
41a0: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
41b0: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74   sorted */.  int
41c0: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
41d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
41e0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
41f0: 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20   data array */. 
4200: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
4210: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4220: 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72  f reg prior to r
4230: 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65  egData available
4240: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20   for use */.){. 
4250: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4260: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20    /* Stmt under 
4290: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
42a0: 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70    int bSeq = ((p
42b0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
42c0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
42d0: 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74  rter)==0);.  int
42e0: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
42f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4310: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
4320: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
4330: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
4340: 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20  bSeq + nData;   
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4360: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in sorter
4370: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
4380: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43b0: 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72   Regs for 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 52 65 63 6f 72 64 20 3d 20 2b 2b 70   regRecord = ++p
43e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4400: 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65   Assembled sorte
4410: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4420: 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74  t nOBSat = pSort
4430: 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  ->nOBSat;       
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4450: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
4460: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e   to skip */.  in
4470: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64   /* Opcode to ad
44a0: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
44b0: 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  to sorter */..  
44c0: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
44d0: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
44e0: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20 29  if( nPrefixReg )
44f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
4500: 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b  refixReg==nExpr+
4510: 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42  bSeq );.    regB
4520: 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20  ase = regData - 
4530: 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20  nExpr - bSeq;.  
4540: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
4550: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
4560: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
4570: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
4580: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
4590: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
45a0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70  pParse, pSort->p
45b0: 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65  OrderBy, regBase
45c0: 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  , SQLITE_ECEL_DU
45d0: 50 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29  P);.  if( bSeq )
45e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
45f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
4600: 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69  quence, pSort->i
4610: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
4620: 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69  +nExpr);.  }.  i
4630: 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30  f( nPrefixReg==0
4640: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4650: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
4660: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
4670: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
4680: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20   nData);.  }..  
4690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46a0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
46b0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
46c0: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
46d0: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
46e0: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
46f0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4700: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4710: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4720: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
4730: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
4740: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
4750: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
4760: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
4770: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4780: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
4790: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
47a0: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
47b0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
47c0: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
47d0: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
47e0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
47f0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
4800: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
4810: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
4820: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
4830: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4840: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
4850: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
4860: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
4870: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
4880: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
4890: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
48a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
48b0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
48c0: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
48d0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
48e0: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
48f0: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
4900: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4910: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4920: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
4930: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
4940: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
4950: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
4960: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
4970: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
4980: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
4990: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
49a0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
49b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
49c0: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
49d0: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
49e0: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
49f0: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
4a00: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
4a10: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
4a20: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
4a30: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
4a40: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
4a50: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
4a60: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
4a70: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
4a80: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
4a90: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
4aa0: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
4ab0: 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73  Field); /* Makes
4ac0: 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74   OP_Jump below t
4ad0: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4ae0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4af0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4b00: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4b10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4b20: 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20   pKI->nXField>2 
4b30: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
4b40: 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
4b50: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
4b60: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4b70: 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20  derBy, nOBSat,. 
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e            pKI->n
4bb0: 58 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  XField-1);.    a
4bc0: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
4bd0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4be0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4bf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4c00: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
4c10: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
4c20: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4c30: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
4c40: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
4c50: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4c60: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
4c70: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
4c80: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
4c90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4ca0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
4cb0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
4cc0: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
4cd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4ce0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
4cf0: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
4d00: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4d10: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4d20: 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73  Here(v, addrFirs
4d30: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4d40: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
4d50: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67  se, regBase, reg
4d60: 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e  PrevKey, pSort->
4d70: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c  nOBSat);.    sql
4d80: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4d90: 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20  (v, addrJmp);.  
4da0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  }.  if( pSort->s
4db0: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
4dc0: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
4dd0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72  .    op = OP_Sor
4de0: 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c  terInsert;.  }el
4df0: 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  se{.    op = OP_
4e00: 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20  IdxInsert;.  }. 
4e10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e20: 70 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  p2(v, op, pSort-
4e30: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
4e40: 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53 65  cord);.  if( pSe
4e50: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
4e60: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
4e70: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
4e80: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
4e90: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
4ea0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
4eb0: 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20  ->iOffset+1;.   
4ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c   }else{.      iL
4ed0: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
4ee0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  iLimit;.    }.  
4ef0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
4f00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4f10: 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d  _IfNotZero, iLim
4f20: 69 74 2c 20 30 2c 20 2d 31 29 3b 20 56 64 62 65  it, 0, -1); Vdbe
4f30: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4f40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f50: 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70  p1(v, OP_Last, p
4f60: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4f80: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
4f90: 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ete, pSort->iECu
4fa0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4fb0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4fc0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
4fd0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
4fe0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
4ff0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5000: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5010: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5020: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5030: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5040: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5050: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
5060: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
5070: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
5080: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
5090: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
50a0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
50b0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
50c0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
50d0: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  fset>0 ){.    in
50e0: 74 20 61 64 64 72 3b 0a 20 20 20 20 61 64 64 72  t addr;.    addr
50f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5100: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp3(v, OP_IfNeg
5110: 2c 20 69 4f 66 66 73 65 74 2c 20 30 2c 20 2d 31  , iOffset, 0, -1
5120: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
5130: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
5140: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5150: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
5160: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
5170: 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f  ment((v, "skip O
5180: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
5190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
51a0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
51b0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
51c0: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
51d0: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
51e0: 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67  e sure the N reg
51f0: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
5200: 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20  at iMem.** form 
5210: 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79  a distinct entry
5220: 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72  .  iTab is a sor
5230: 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
5240: 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79  holds previously
5250: 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61  .** seen combina
5260: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76  tions of the N v
5270: 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e  alues.  A new en
5280: 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69  try is made in i
5290: 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  Tab.** if the cu
52a0: 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61  rrent N values a
52b0: 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20  re new..**.** A 
52c0: 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65  jump to addrRepe
52d0: 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74  at is made and t
52e0: 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72  he N+1 values ar
52f0: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
5300: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
5310: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
5320: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
5330: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5340: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
5350: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5360: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
5370: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
5380: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5390: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
53a0: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
53b0: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
53c0: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
53d0: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
53e0: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
53f0: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
5400: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
5410: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
5420: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5430: 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  f elements */.  
5440: 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20  int iMem        
5450: 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d     /* First elem
5460: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
5470: 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a   *v;.  int r1;..
5480: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
5490: 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  dbe;.  r1 = sqli
54a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
54b0: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
54c0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
54d0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
54e0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65   addrRepeat, iMe
54f0: 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72  m, N); VdbeCover
5500: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
5510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5520: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
5530: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
5540: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5550: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
5560: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
5570: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5580: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5590: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
55a0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
55b0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
55c0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
55d0: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
55e0: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
55f0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
5600: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
5610: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
5620: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
5630: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
5640: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
5650: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
5660: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
5670: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
5680: 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a   used to occur.*
5690: 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  * in multiple pl
56a0: 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f  aces.  (The erro
56b0: 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e  r only occurs in
56c0: 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20   one place now, 
56d0: 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e  but we.** retain
56e0: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
56f0: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65  to minimize code
5700: 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f   disruption.).*/
5710: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
5720: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
5730: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
5740: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5750: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
5760: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
5770: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
5780: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
5790: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
57a0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
57b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
57c0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
57d0: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
57e0: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
57f0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
5800: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
5810: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
5820: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
5830: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
5840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5850: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
5860: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
5870: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
5880: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
5890: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
58a0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
58b0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
58c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
58d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23  eturn 0;.  }.}.#
58e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
58f0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
5900: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
5910: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
5920: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
5930: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
5940: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
5950: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
5960: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
5970: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
5980: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
5990: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
59a0: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
59b0: 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20  If srcTab is.** 
59c0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68  zero or more, th
59d0: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
59e0: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
59f0: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
5a00: 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74   only .** to get
5a10: 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e 73 20   number columns 
5a20: 61 6e 64 20 74 68 65 20 64 61 74 61 74 79 70 65  and the datatype
5a30: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
5a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5a50: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
5a60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5a70: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
5a80: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
5a90: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
5aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5ab0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
5ac0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5ad0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
5ae0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5af0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
5b00: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
5b10: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
5b20: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
5b30: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
5b40: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
5b50: 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74  able */.  SortCt
5b60: 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20  x *pSort,       
5b70: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
5b80: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5b90: 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42   process ORDER B
5ba0: 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  Y */.  DistinctC
5bb0: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
5bc0: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
5bd0: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
5be0: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
5bf0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
5c00: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
5c10: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
5c20: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
5c30: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
5c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5c50: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
5c60: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
5c70: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5c90: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
5ca0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
5cb0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
5cc0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5cd0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5ce0: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
5cf0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
5d00: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
5d10: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
5d20: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
5d30: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
5d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
5d50: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
5d60: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
5d70: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
5d80: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
5d90: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
5da0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
5db0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
5dc0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
5dd0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
5de0: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
5df0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
5e00: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
5e10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5e20: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
5e30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
5e40: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
5e50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
5e60: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
5e70: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
5e80: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
5e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  );.  assert( pEL
5ea0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
5eb0: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
5ec0: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
5ed0: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
5ee0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
5ef0: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
5f00: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
5f10: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
5f20: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
5f30: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
5f40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
5f50: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
5f60: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
5f70: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
5f80: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
5f90: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
5fa0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
5fb0: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
5fc0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
5fd0: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ;..  if( pDest->
5fe0: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
5ff0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
6000: 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20     nPrefixReg = 
6010: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
6020: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >nExpr;.      if
6030: 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  ( !(pSort->sortF
6040: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
6050: 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72  UseSorter) ) nPr
6060: 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20  efixReg++;.     
6070: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6080: 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20   nPrefixReg;.   
6090: 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53   }.    pDest->iS
60a0: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
60b0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
60c0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
60d0: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
60e0: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e  ( pDest->iSdst+n
60f0: 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72  ResultCol > pPar
6100: 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  se->nMem ){.    
6110: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  /* This is an er
6120: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68  ror condition th
6130: 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66  at can result, f
6140: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
6150: 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a   a SELECT.    **
6160: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
6170: 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e  nd side of an IN
6180: 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  SERT contains mo
6190: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
61a0: 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  s than.    ** th
61b0: 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  ere are columns 
61c0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  in the table on 
61d0: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65  the left.  The e
61e0: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75  rror will be cau
61f0: 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72  ght.    ** and r
6200: 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20  eported later.  
6210: 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
6220: 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20  ake sure enough 
6230: 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
6240: 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76  ted.    ** to av
6250: 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f  oid other spurio
6260: 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  us errors in the
6270: 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20   meantime. */.  
6280: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
6290: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
62a0: 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  }.  pDest->nSdst
62b0: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
62c0: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
62d0: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28  st->iSdst;.  if(
62e0: 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20   srcTab>=0 ){.  
62f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
6300: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
6310: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6320: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6330: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
6340: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
6350: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
6360: 28 76 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  (v, "%s", pEList
6370: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
6380: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
6390: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
63a0: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
63b0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
63c0: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
63d0: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
63e0: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
63f0: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
6400: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
6410: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
6420: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65  .    */.    u8 e
6430: 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20 69 66  celFlags;.    if
6440: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
6450: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f   || eDest==SRT_O
6460: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
6470: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
6480: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
6490: 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   = SQLITE_ECEL_D
64a0: 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  UP;.    }else{. 
64b0: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d       ecelFlags =
64c0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
64d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
64e0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
64f0: 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  List, regResult,
6500: 20 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d   ecelFlags);.  }
6510: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
6520: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
6530: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
6540: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6550: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
6560: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
6570: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
6580: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
6590: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
65a0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
65b0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
65c0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74  inct ){.    swit
65d0: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
65e0: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
65f0: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6600: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
6610: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
6620: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
6630: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
6640: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
6650: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
6660: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
6670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6680: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
6690: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
66a0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
66b0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
66c0: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
66d0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
66e0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
66f0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
6700: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
6710: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
6720: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
6730: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
6740: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20  esultCol;..     
6750: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
6760: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
6770: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
6780: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
6790: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
67a0: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
67b0: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
67c0: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
67d0: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
67e0: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
67f0: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
6800: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
6810: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
6820: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
6830: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
6840: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
6850: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
6860: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
6870: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
6880: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
6890: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
68a0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
68b0: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
68c0: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
68d0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
68e0: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
68f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
6900: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
6910: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
6920: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
6930: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
6940: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
6950: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
6960: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
6970: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20  ResultCol;.     
6980: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
6990: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
69a0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
69b0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
69c0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
69d0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
69e0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
69f0: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
6a00: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
6a10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6a20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
6a30: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
6a40: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
6a50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
6a60: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6a70: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
6a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6aa0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
6ab0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
6ac0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
6ad0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
6ae0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
6af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6b00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6b10: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
6b20: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
6b30: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
6b40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6b50: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
6b60: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
6b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6b80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6b90: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6ba0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
6bb0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6bc0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
6bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6be0: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
6bf0: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
6c00: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
6c10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6c20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6c30: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
6c40: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
6c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6c60: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
6c70: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
6c80: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
6c90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6ca0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
6cb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6cc0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
6cd0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
6ce0: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
6cf0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
6d00: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
6d10: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
6d20: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
6d30: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
6d50: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
6d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6d70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6d80: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
6d90: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6da0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6db0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
6dc0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
6dd0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
6de0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
6df0: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
6e00: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
6e10: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
6e20: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
6e30: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
6e40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
6e50: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
6e60: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
6e70: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
6e80: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
6e90: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6ea0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
6eb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6ec0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6ed0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6ee0: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
6ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6f00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
6f10: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
6f20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6f30: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6f40: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
6f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6f60: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
6f70: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
6f80: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
6f90: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
6fa0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
6fb0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
6fc0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
6fd0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
6fe0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
6ff0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
7000: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
7010: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
7020: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7030: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7040: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
7050: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
7060: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7080: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7090: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
70a0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
70b0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
70c0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
70d0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
70e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
70f0: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
7100: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
7110: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
7120: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
7130: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
7140: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
7150: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
7160: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
7170: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
7180: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
7190: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
71a0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
71b0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
71c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
71d0: 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29  Dest==SRT_Fifo )
71e0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
71f0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
7200: 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73  tFifo );.      s
7210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7220: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
7230: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
7240: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72  esultCol, r1+nPr
7250: 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65  efixReg);.#ifnde
7260: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
7270: 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  E.      if( eDes
7280: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7290: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
72a0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
72b0: 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68   is DistFifo, th
72c0: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
72d0: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
72e0: 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68      ** on an eph
72f0: 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66  emeral index. If
7300: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
7310: 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
7320: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
7330: 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20  n the index, do 
7340: 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20  not write it to 
7350: 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e  the output. If n
7360: 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20  ot, add the.    
7370: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72      ** current r
7380: 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ow to the index 
7390: 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
73a0: 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74   writing it to t
73b0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
73c0: 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65  tput table as we
73d0: 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
73e0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
73f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
7400: 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20  r(v) + 4;.      
7410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7420: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
7430: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64  nd, iParm+1, add
7440: 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  r, r1, 0);.     
7450: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
7460: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
7470: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7480: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
7490: 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20  Parm+1, r1);.   
74a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f       assert( pSo
74b0: 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  rt==0 );.      }
74c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
74d0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
74e0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
74f0: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
7500: 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65   p, r1+nPrefixRe
7510: 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67  g, 1, nPrefixReg
7520: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7530: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
7540: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7550: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7570: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
7580: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
7590: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
75a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
75b0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
75c0: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
75d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
75e0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
75f0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
7600: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7610: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7620: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
7630: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7640: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7650: 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67  , r1, nPrefixReg
7660: 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +1);.      break
7670: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
7680: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7690: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
76a0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
76b0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
76c0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
76d0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
76e0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
76f0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
7700: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
7710: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
7720: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
7730: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
7740: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
7750: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
7760: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
7770: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
7780: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
7790: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
77a0: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
77b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
77c0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
77d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
77e0: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
77f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
7800: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
7810: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
7820: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
7830: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
7840: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
7850: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
7860: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
7870: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
7880: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
7890: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
78a0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
78b0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
78c0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
78d0: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
78e0: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
78f0: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
7900: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
7910: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7920: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7930: 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69  esult, 1, nPrefi
7940: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
7950: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7960: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7970: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7990: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
79a0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
79b0: 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65  esult,1,r1, &pDe
79c0: 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b  st->affSdst, 1);
79d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
79e0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
79f0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7a00: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
7a10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7a20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7a30: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7a40: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
7a50: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7a60: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
7a70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7a80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
7a90: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
7aa0: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
7ab0: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
7ac0: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
7ad0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
7ae0: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
7af0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7b00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7b10: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
7b20: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
7b30: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
7b40: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
7b50: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7b60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7b70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
7b80: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
7b90: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
7ba0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
7bb0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
7bc0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
7bd0: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
7be0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
7bf0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
7c00: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
7c10: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
7c20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
7c30: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
7c40: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
7c50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7c60: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7c70: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7c80: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7c90: 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72  egResult, 1, nPr
7ca0: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
7cb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7cc0: 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74  ssert( regResult
7cd0: 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20  ==iParm );.     
7ce0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
7cf0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
7d00: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
7d10: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
7d20: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7d30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
7d40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d50: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
7d60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
7d70: 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f  routine:       /
7d80: 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61  * Send data to a
7d90: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
7da0: 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70     case SRT_Outp
7db0: 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  ut: {        /* 
7dc0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
7dd0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
7de0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7df0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
7e00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7e10: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
7e20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7e30: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7e40: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7e50: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7e60: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7e70: 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67  tCol, nPrefixReg
7e80: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7e90: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  f( eDest==SRT_Co
7ea0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
7eb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ec0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
7ed0: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
7ee0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7f00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7f10: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
7f20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7f30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7f40: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
7f50: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
7f60: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7f70: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
7f80: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7f90: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
7fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7fb0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
7fc0: 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72  esults into a pr
7fd0: 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61  iority queue tha
7fe0: 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72  t is order accor
7ff0: 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70  ding to.    ** p
8000: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28  Dest->pOrderBy (
8010: 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d  in pSO).  pDest-
8020: 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61  >iSDParm (in iPa
8030: 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f  rm) is the curso
8040: 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  r for an.    ** 
8050: 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e  index with pSO->
8060: 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e  nExpr+2 columns.
8070: 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73    Build a key us
8080: 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20  ing pSO for the 
8090: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f  first.    ** pSO
80a0: 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c  ->nExpr columns,
80b0: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
80c0: 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69  all keys are uni
80d0: 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a  que by adding a.
80e0: 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f      ** final OP_
80f0: 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e  Sequence column.
8100: 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d    The last colum
8110: 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20  n is the record 
8120: 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a  as a blob..    *
8130: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  /.    case SRT_D
8140: 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61  istQueue:.    ca
8150: 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a  se SRT_Queue: {.
8160: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
8170: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
8180: 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  , r3;.      int 
8190: 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20  addrTest = 0;.  
81a0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
81b0: 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70  O;.      pSO = p
81c0: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Dest->pOrderBy;.
81d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
81e0: 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20  O );.      nKey 
81f0: 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pSO->nExpr;.  
8200: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
8210: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
8220: 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  e);.      r2 = s
8230: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
8240: 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b  ge(pParse, nKey+
8250: 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72  2);.      r3 = r
8260: 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20  2+nKey+1;.      
8270: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
8280: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
8290: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
82a0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
82b0: 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72  tQueue, then cur
82c0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
82d0: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
82e0: 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68   on a second eph
82f0: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61  emeral index tha
8300: 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75  t holds all valu
8310: 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75  es every previou
8320: 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  sly.        ** a
8330: 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75  dded to the queu
8340: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  e. */.        ad
8350: 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  drTest = sqlite3
8360: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
8370: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d   OP_Found, iParm
8380: 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  +1, 0, .        
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
83c0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
83d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
83e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
83f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8400: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8410: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8420: 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20  esultCol, r3);. 
8430: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
8440: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
8450: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8460: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8470: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
8480: 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  m+1, r3);.      
8490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
84a0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
84b0: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
84c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
84d0: 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69  r(i=0; i<nKey; i
84e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
84f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8500: 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20  , OP_SCopy,.    
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 20        regResult 
8530: 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  + pSO->a[i].u.x.
8540: 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c  iOrderByCol - 1,
8550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8560: 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29             r2+i)
8570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8580: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8590: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
85a0: 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79  , iParm, r2+nKey
85b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
85c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
85d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c  _MakeRecord, r2,
85e0: 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20   nKey+2, r1);.  
85f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8600: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8610: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
8620: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  );.      if( add
8630: 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33 56  rTest ) sqlite3V
8640: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
8650: 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20  ddrTest);.      
8660: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8670: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
8680: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8690: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
86a0: 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65  (pParse, r2, nKe
86b0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  y+2);.      brea
86c0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
86d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
86e0: 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  TE */....#if !de
86f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8700: 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f  T_TRIGGER).    /
8710: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
8720: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
8730: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
8740: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
8750: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
8760: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
8770: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
8780: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
8790: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
87a0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
87b0: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
87c0: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
87d0: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
87e0: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
87f0: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
8800: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
8810: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
8820: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
8830: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63   eDest==SRT_Disc
8840: 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ard );.      bre
8850: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8860: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
8870: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
8880: 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
8890: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20  MIT is reached. 
88a0: 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a   Except, if.  **
88b0: 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74   there is a sort
88c0: 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  er, in which cas
88d0: 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73  e the sorter has
88e0: 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64   already limited
88f0: 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  .  ** the output
8900: 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20   for us..  */.  
8910: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20  if( pSort==0 && 
8920: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
8930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8940: 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
8950: 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  pZero, p->iLimit
8960: 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
8970: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
8980: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
8990: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
89a0: 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f  ct sufficient fo
89b0: 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20  r an index of N 
89c0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a  key columns and.
89d0: 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d  ** X extra colum
89e0: 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ns..*/.KeyInfo *
89f0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
8a00: 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  loc(sqlite3 *db,
8a10: 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a   int N, int X){.
8a20: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73    KeyInfo *p = s
8a30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8a40: 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20  ro(0, .         
8a50: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
8a60: 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58  (KeyInfo) + (N+X
8a70: 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  )*(sizeof(CollSe
8a80: 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20 70  q*)+1));.  if( p
8a90: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74   ){.    p->aSort
8aa0: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d  Order = (u8*)&p-
8ab0: 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20  >aColl[N+X];.   
8ac0: 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31   p->nField = (u1
8ad0: 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69  6)N;.    p->nXFi
8ae0: 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20  eld = (u16)X;.  
8af0: 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64    p->enc = ENC(d
8b00: 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
8b10: 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20  db;.    p->nRef 
8b20: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
8b30: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
8b40: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ed = 1;.  }.  re
8b50: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
8b60: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65   Deallocate a Ke
8b70: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
8b80: 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49  void sqlite3KeyI
8b90: 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f  nfoUnref(KeyInfo
8ba0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
8bb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8bc0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
8bd0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
8be0: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71   p->nRef==0 ) sq
8bf0: 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
8c00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8c10: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
8c20: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
8c30: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
8c40: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
8c50: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
8c60: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
8c70: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
8c80: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
8c90: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
8ca0: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
8cb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
8cc0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
8cd0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
8ce0: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
8cf0: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
8d00: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
8d10: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
8d20: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
8d30: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
8d40: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
8d50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8d60: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
8d70: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8d80: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
8d90: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
8da0: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
8db0: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
8dc0: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
8dd0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8de0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
8df0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
8e00: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
8e10: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
8e20: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
8e30: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
8e40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
8e50: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
8e60: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
8e70: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
8e80: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
8e90: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
8ea0: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
8eb0: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
8ec0: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
8ed0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
8ee0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
8ef0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
8f00: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
8f10: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
8f20: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
8f30: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
8f40: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
8f50: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
8f60: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
8f70: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
8f80: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
8f90: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
8fa0: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
8fb0: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
8fc0: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
8fd0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
8fe0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
8ff0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
9000: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
9010: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
9020: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
9030: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
9040: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
9050: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
9060: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
9070: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
9080: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
9090: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
90a0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
90b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
90c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
90d0: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
90e0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
90f0: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
9100: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
9110: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
9120: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
9130: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
9140: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
9150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9160: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
9170: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
9180: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
9190: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
91a0: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
91b0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
91c0: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
91d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
91e0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
91f0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
9200: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
9210: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9220: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
9230: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
9240: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
9250: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9260: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
9270: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
9280: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
9290: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
92a0: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
92b0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
92c0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
92d0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
92e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
92f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
9300: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
9310: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
9320: 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
9330: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  fltColl;.      p
9340: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53  Info->aColl[i-iS
9350: 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  tart] = pColl;. 
9360: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
9370: 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d  tOrder[i-iStart]
9380: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
9390: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
93a0: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
93b0: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
93c0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
93d0: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
93e0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
93f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9400: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
9410: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
9420: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
9430: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
9440: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
9450: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
9460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9470: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
9480: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
9490: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
94a0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
94b0: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
94c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94d0: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
94e0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
94f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
9500: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
9510: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9520: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
9530: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
9540: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
9550: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
9560: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
9570: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
9580: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
9590: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
95a0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
95b0: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
95c0: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
95d0: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
95e0: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
95f0: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
9600: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
9610: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
9620: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
9630: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
9640: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
9650: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
9660: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
9670: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
9680: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
9690: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
96a0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
96b0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
96c0: 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70  zUsage){.  if( p
96d0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
96e0: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
96f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9700: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
9710: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9720: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55  f(pParse->db, "U
9730: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
9740: 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b  OR %s", zUsage);
9750: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9760: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
9770: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
9780: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
9790: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
97a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
97b0: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
97c0: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
97d0: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
97e0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
97f0: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
9800: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
9810: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
9820: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
9830: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
9840: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
9850: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
9860: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
9870: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
9880: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
9890: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
98a0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
98b0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
98c0: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
98d0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
98e0: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
98f0: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
9900: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
9910: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
9920: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
9930: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
9940: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
9950: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
9960: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
9970: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
9980: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
9990: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
99a0: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ,z).#endif..#if 
99b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
99c0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26  OMIT_EXPLAIN) &&
99d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
99e0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
99f0: 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c  ELECT)./*.** Unl
9a00: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
9a10: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
9a20: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
9a30: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
9a40: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
9a50: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
9a60: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
9a70: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
9a80: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
9a90: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
9aa0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65  aption is of one
9ab0: 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d   of the two form
9ac0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50  s:.**.**   "COMP
9ad0: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
9ae0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
9af0: 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d   (op)".**   "COM
9b00: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
9b10: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
9b20: 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  2 USING TEMP B-T
9b30: 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20  REE (op)".**.** 
9b40: 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20  where iSub1 and 
9b50: 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e  iSub2 are the in
9b60: 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73  tegers passed as
9b70: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
9b80: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  ng.** function p
9b90: 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f  arameters, and o
9ba0: 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65  p is the text re
9bb0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
9bc0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  the parameter.**
9bd0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
9be0: 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
9bf0: 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e   "op" must be on
9c00: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
9c10: 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f  K_EXCEPT,.** TK_
9c20: 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f  INTERSECT or TK_
9c30: 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66  ALL. The first f
9c40: 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61  orm is used if a
9c50: 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20  rgument bUseTmp 
9c60: 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72  is .** false, or
9c70: 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   the second form
9c80: 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a   if it is true..
9c90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
9ca0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
9cb0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9cd0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
9ce0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
9d10: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9d20: 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20  EXCEPT etc. */. 
9d30: 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20   int iSub1,     
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
9d60: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  1 */.  int iSub2
9d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9d80: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
9d90: 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74  ry id 2 */.  int
9da0: 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20   bUseTmp        
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9dc0: 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74  True if a temp t
9dd0: 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f  able was used */
9de0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  .){.  assert( op
9df0: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70  ==TK_UNION || op
9e00: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
9e10: 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
9e20: 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b  || op==TK_ALL );
9e30: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
9e40: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
9e50: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
9e60: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
9e70: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
9e80: 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20  e3MPrintf(.     
9e90: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22     pParse->db, "
9ea0: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
9eb0: 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73  IES %d AND %d %s
9ec0: 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53  (%s)", iSub1, iS
9ed0: 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73  ub2,.        bUs
9ee0: 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50  eTmp?"USING TEMP
9ef0: 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65   B-TREE ":"", se
9f00: 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20  lectOpName(op). 
9f10: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
9f20: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
9f30: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
9f40: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
9f50: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
9f60: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
9f70: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
9f80: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
9f90: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
9fa0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
9fb0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
9fc0: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c  inComposite(v,w,
9fd0: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
9fe0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
9ff0: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
a000: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
a010: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
a020: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
a030: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
a040: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
a050: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
a060: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
a070: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
a080: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
a090: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
a0a0: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
a0b0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
a0c0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
a0d0: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
a0e0: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
a0f0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
a100: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
a110: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
a120: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a130: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
a140: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
a150: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
a160: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
a170: 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ort,   /* Inform
a180: 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44  ation on the ORD
a190: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
a1a0: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
a1b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a1c0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
a1d0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
a1e0: 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65   *pDest /* Write
a1f0: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
a200: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
a210: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a220: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a240: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
a250: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
a260: 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
a270: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
a280: 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d  l(v);     /* Jum
a290: 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c  p here to exit l
a2a0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
a2b0: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  rContinue = sqli
a2c0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
a2d0: 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65  (v);  /* Jump he
a2e0: 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c  re for next cycl
a2f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  e */.  int addr;
a300: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
a310: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
a320: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
a330: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
a340: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
a350: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
a360: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
a370: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
a380: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
a390: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
a3a0: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
a3b0: 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20  nt iSortTab;    
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a3d0: 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
a3e0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
a3f0: 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b    int nSortData;
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61    /* Trailing va
a420: 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f  lues to read fro
a430: 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  m sorter */.  in
a440: 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b  t i;.  int bSeq;
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a460: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a470: 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  f sorter record 
a480: 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f  includes seq. no
a490: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
a4a0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
a4b0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72  N_COMMENTS.  str
a4c0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a4d0: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
a4e0: 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66  EList->a;.#endif
a4f0: 0a 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c  ..  if( pSort->l
a500: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
a510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a520: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
a530: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
a540: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
a550: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
a560: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a570: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 42  P_Goto, 0, addrB
a580: 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  reak);.    sqlit
a590: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a5a0: 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  el(v, pSort->lab
a5b0: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  elBkOut);.  }.  
a5c0: 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45  iTab = pSort->iE
a5d0: 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44  Cursor;.  if( eD
a5e0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
a5f0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
a600: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 72  routine ){.    r
a610: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
a620: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
a630: 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72  >iSdst;.    nSor
a640: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
a650: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
a660: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
a670: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a680: 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  e);.    regRow =
a690: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a6a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a6b0: 6e 53 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a 20  nSortData = 1;. 
a6c0: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
a6d0: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
a6e0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
a6f0: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
a700: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
a710: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
a720: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
a730: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a740: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
a750: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
a760: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
a770: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
a780: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
a790: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
a7a0: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
a7b0: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
a7c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a7d0: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
a7e0: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
a7f0: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
a800: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
a810: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
a820: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
a830: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
a840: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
a850: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
a860: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
a870: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
a880: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
a890: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a8a0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
a8b0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
a8c0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
a8d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a8e0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
a8f0: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
a900: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
a910: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
a920: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
a930: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
a940: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a950: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
a960: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
a970: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
a980: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
a990: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
a9a0: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
a9b0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
a9c0: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
a9d0: 28 69 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74  (i=0; i<nSortDat
a9e0: 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  a; i++){.    sql
a9f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
aa00: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f  , OP_Column, iSo
aa10: 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71  rtTab, nKey+bSeq
aa20: 2b 69 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  +i, regRow+i);. 
aa30: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
aa40: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
aa50: 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45  i].zName ? aOutE
aa60: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
aa70: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
aa80: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
aa90: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
aaa0: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
aab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aac0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
aad0: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
aae0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
aaf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ab00: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
ab10: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
ab20: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
ab30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ab40: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
ab50: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
ab60: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
ab70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
ab80: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
ab90: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
aba0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
abb0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
abc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
abd0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
abe0: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
abf0: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
ac10: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31  Dest->affSdst, 1
ac20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ac30: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
ac40: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
ac50: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
ac60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ac70: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
ac80: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
ac90: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
aca0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
acb0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
acc0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
acd0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
ace0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
acf0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
ad00: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
ad10: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
ad20: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
ad30: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
ad40: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
ad50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
ad60: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
ad70: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
ad80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
ad90: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
ada0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
adb0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
adc0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
add0: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
ade0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
adf0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
ae00: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
ae10: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
ae20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ae30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
ae40: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
ae50: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
ae60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ae70: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
ae80: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
ae90: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
aea0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
aeb0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
aec0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
aed0: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
aee0: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
aef0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
af00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
af10: 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  regRowid ){.    
af20: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
af30: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
af40: 67 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  gRow);.    sqlit
af50: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
af60: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
af70: 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65  d);.  }.  /* The
af80: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
af90: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
afa0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
afb0: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e  el(v, addrContin
afc0: 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  ue);.  if( pSort
afd0: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
afe0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
aff0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
b000: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b010: 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62  SorterNext, iTab
b020: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
b030: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73  erage(v);.  }els
b040: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
b050: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b060: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
b070: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b080: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
b090: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20  rt->regReturn ) 
b0a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b0b0: 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
b0c0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
b0d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b0e0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b0f0: 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f  addrBreak);.}../
b100: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
b110: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
b120: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
b130: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
b140: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
b150: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
b160: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
b170: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
b180: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
b190: 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72  r..**.** Also tr
b1a0: 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
b1b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
b1c0: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64  turned value and
b1d0: 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20   return that.** 
b1e0: 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57  result in *pEstW
b1f0: 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  idth..**.** The 
b200: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b210: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
b220: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
b230: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
b240: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
b250: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b260: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
b270: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
b280: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
b290: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
b2a0: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
b2b0: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
b2c0: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
b2d0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
b2e0: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
b2f0: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
b300: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
b310: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
b320: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
b330: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
b340: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
b350: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
b360: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
b370: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
b380: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
b390: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
b3a0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
b3b0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
b3c0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
b3d0: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
b3e0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
b3f0: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
b400: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
b410: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
b420: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
b430: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
b440: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
b450: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
b460: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
b470: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
b480: 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68  routine has eith
b490: 65 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65  er 3 or 6 parame
b4a0: 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ters depending o
b4b0: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
b4c0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45  .** the SQLITE_E
b4d0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b4e0: 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69  ADATA compile-ti
b4f0: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  me option is use
b500: 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  d..*/.#ifdef SQL
b510: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b520: 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66  N_METADATA.# def
b530: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
b540: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
b550: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43  mnTypeImpl(A,B,C
b560: 2c 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a  ,D,E,F).#else /*
b570: 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c   if !defined(SQL
b580: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b590: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23  N_METADATA) */.#
b5a0: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
b5b0: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
b5c0: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
b5d0: 2c 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73 74 61  ,B,F).#endif.sta
b5e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
b5f0: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a  columnTypeImpl(.
b600: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
b610: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
b620: 70 72 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pr,.#ifdef SQLIT
b630: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
b640: 4d 45 54 41 44 41 54 41 0a 20 20 63 6f 6e 73 74  METADATA.  const
b650: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
b660: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b670: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
b680: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
b690: 67 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75  gCol,.#endif.  u
b6a0: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
b6b0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
b6c0: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  ype = 0;.  int j
b6d0: 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20  ;.  u8 estWidth 
b6e0: 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
b6f0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b700: 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61 72  _METADATA.  char
b710: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20   const *zOrigDb 
b720: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
b730: 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  t *zOrigTab = 0;
b740: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b750: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e  OrigCol = 0;.#en
b760: 64 69 66 0a 0a 20 20 69 66 28 20 4e 45 56 45 52  dif..  if( NEVER
b770: 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e  (pExpr==0) || pN
b780: 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  C->pSrcList==0 )
b790: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
b7a0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
b7b0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
b7c0: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
b7d0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
b7e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
b7f0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
b800: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
b810: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
b820: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
b830: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
b840: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
b850: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
b860: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
b870: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
b880: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
b890: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
b8a0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
b8b0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
b8c0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
b8d0: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
b8e0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b8f0: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
b900: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
b910: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
b920: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
b930: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
b940: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
b950: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
b960: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
b970: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
b980: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b990: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
b9a0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
b9b0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
b9c0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
b9d0: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
b9e0: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
b9f0: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
ba00: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
ba10: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
ba20: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
ba30: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
ba40: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
ba50: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
ba60: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
ba70: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
ba80: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
ba90: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
baa0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
bab0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
bac0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
bad0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
bae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
baf0: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
bb00: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
bb10: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
bb20: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
bb30: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
bb40: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
bb50: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
bb60: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
bb70: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
bb80: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
bb90: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
bba0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
bbb0: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
bbc0: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
bbd0: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
bbe0: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
bbf0: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
bc00: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
bc10: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
bc20: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
bc30: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
bc40: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
bc50: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
bc60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
bc70: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
bc80: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
bc90: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
bca0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
bcb0: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
bcc0: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
bcd0: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
bce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
bcf0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
bd00: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
bd10: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
bd20: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
bd30: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
bd40: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
bd50: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
bd60: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
bd70: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
bd80: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
bd90: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
bda0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
bdb0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
bdc0: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
bdd0: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
bde0: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
bdf0: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
be00: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
be10: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
be20: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
be30: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
be40: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
be50: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
be60: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
be70: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
be80: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
be90: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
bea0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
beb0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
bec0: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
bed0: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
bee0: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
bef0: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
bf00: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
bf10: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
bf20: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
bf30: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
bf40: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
bf50: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
bf60: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
bf70: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bf80: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
bf90: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
bfa0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
bfb0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
bfc0: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
bfd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
bfe0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
bff0: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
c000: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
c010: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
c020: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
c030: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
c040: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
c050: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
c060: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
c070: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
c080: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
c090: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
c0a0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
c0b0: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
c0c0: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
c0d0: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
c0e0: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
c0f0: 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
c100: 54 68 65 20 41 4c 57 41 59 53 28 29 20 69 73 20  The ALWAYS() is 
c110: 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53  because iCol>=pS
c120: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
c130: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 20  will have been. 
c140: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 67           ** caug
c150: 68 74 20 61 6c 72 65 61 64 79 20 62 79 20 6e 61  ht already by na
c160: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20  me resolution.. 
c170: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
c180: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
c190: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
c1a0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
c1b0: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
c1c0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
c1d0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
c1e0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
c1f0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
c200: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
c210: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
c220: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
c230: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
c240: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
c250: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
c260: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
c270: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20  idth); .        
c280: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
c290: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
c2a0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
c2b0: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
c2c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
c2d0: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
c2e0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
c2f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
c300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
c310: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
c320: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
c330: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
c340: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c350: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
c360: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
c370: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
c380: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
c390: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
c3a0: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
c3b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c3c0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c3d0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c3e0: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
c3f0: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
c400: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
c410: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
c420: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
c430: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
c440: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
c450: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
c460: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
c470: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
c480: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
c490: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
c4a0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
c4b0: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
c4c0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
c4d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
c4e0: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
c4f0: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
c500: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
c510: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69  .#else.        i
c520: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
c530: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
c540: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
c550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c560: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
c570: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
c580: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
c590: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
c5a0: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
c5b0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
c5c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
c5d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
c5e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c5f0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
c600: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
c610: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c620: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
c630: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
c640: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
c650: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
c660: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
c670: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
c680: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
c690: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
c6a0: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
c6b0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
c6c0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
c6d0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
c6e0: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
c6f0: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
c700: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
c710: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
c720: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
c730: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
c740: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
c750: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
c760: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
c770: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
c780: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
c790: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
c7a0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
c7b0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
c7c0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
c7d0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
c7e0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
c7f0: 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20  , &estWidth); . 
c800: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c810: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
c820: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c830: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c840: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
c850: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
c860: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
c870: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
c880: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
c890: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
c8a0: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
c8b0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
c8c0: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
c8d0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73  #endif.  if( pEs
c8e0: 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69  tWidth ) *pEstWi
c8f0: 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a  dth = estWidth;.
c900: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
c910: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c920: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
c930: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
c940: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
c950: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
c960: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
c970: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
c980: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
c990: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
c9a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c9b0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
c9c0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
c9d0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
c9e0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
c9f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
ca00: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
ca10: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
ca20: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
ca30: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
ca40: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
ca50: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ca60: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
ca70: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
ca80: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
ca90: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
caa0: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
cab0: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
cac0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
cad0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
cae0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
caf0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
cb00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
cb10: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
cb20: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
cb30: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
cb40: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
cb50: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
cb60: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
cb70: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
cb80: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
cb90: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
cba0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
cbb0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
cbc0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
cbd0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
cbe0: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
cbf0: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
cc00: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
cc10: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
cc20: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
cc30: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
cc40: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
cc50: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
cc60: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
cc70: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
cc80: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
cc90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cca0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
ccb0: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
ccc0: 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f  zOrigDb, SQLITE_
ccd0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
cce0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
ccf0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cd00: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
cd10: 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Tab, SQLITE_TRAN
cd20: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
cd30: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
cd40: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
cd50: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
cd60: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
cd70: 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  NT);.#else.    z
cd80: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
cd90: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
cda0: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
cdb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
cdc0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
cdd0: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
cde0: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
cdf0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
ce00: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
ce10: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
ce20: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a  CLTYPE) */.}../*
ce30: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
ce40: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
ce50: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
ce60: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
ce70: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
ce80: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
ce90: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
cea0: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
ceb0: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
cec0: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
ced0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cee0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
cef0: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
cf00: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
cf10: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
cf20: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
cf30: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
cf40: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
cf50: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
cf60: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
cf70: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
cf80: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
cf90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
cfa0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
cfb0: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
cfc0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
cfd0: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
cfe0: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
cff0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d000: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
d010: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
d020: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
d030: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
d040: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
d050: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
d060: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
d070: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
d080: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
d090: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
d0a0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
d0b0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
d0c0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
d0d0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
d0e0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
d0f0: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
d100: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
d110: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d120: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
d130: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
d140: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
d150: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
d160: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
d170: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
d180: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
d190: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
d1a0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
d1b0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
d1c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d1d0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
d1e0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
d1f0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
d200: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
d210: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d220: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d230: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d240: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
d250: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d260: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
d270: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
d280: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
d290: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
d2a0: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
d2b0: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
d2c0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
d2d0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
d2e0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
d2f0: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
d300: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
d310: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
d320: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
d330: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
d340: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
d350: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
d360: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
d370: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
d380: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
d390: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
d3a0: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
d3b0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
d3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
d3d0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
d3e0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
d3f0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
d400: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
d410: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
d420: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
d430: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
d440: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
d450: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
d460: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
d470: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
d480: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
d490: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d4a0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d4b0: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
d4c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
d4d0: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
d4e0: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
d4f0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
d500: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d510: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
d520: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d530: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
d540: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
d550: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
d560: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
d570: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
d580: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d590: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d5a0: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
d5b0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
d5c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d5e0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d5f0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d600: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
d610: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
d620: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
d640: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
d650: 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20  Span;.      z = 
d660: 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50  z==0 ? sqlite3MP
d670: 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d  rintf(db, "colum
d680: 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c  n%d", i+1) : sql
d690: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d6a0: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
d6b0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d6c0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
d6d0: 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44  AME, z, SQLITE_D
d6e0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
d6f0: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
d700: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
d710: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
d720: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
d730: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
d740: 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
d750: 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
d760: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
d770: 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
d780: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
d790: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d7a0: 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
d7b0: 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
d7c0: 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
d7d0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
d7e0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
d7f0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
d800: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
d810: 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
d820: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
d830: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
d840: 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
d850: 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
d860: 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
d870: 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
d880: 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
d890: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
d8a0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
d8b0: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
d8c0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
d8d0: 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
d8e0: 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
d8f0: 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
d900: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
d910: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74  E_NOMEM..*/.stat
d920: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c  ic int selectCol
d930: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
d940: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d950: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
d960: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d970: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
d980: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
d990: 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
d9a0: 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
d9b0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
d9c0: 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
d9d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
d9e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
d9f0: 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
da00: 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
da10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
da20: 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
da30: 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
da40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
da50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
da60: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
da70: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
da80: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
da90: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
daa0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
dab0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
dac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
dad0: 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
dae0: 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
daf0: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
db00: 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
db10: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
db20: 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
db30: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
db40: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
db50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
db60: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
db70: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
db80: 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20   Expr *p;       
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dba0: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61  Expression for a
dbb0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   single result c
dbc0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
dbd0: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
dbe0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
dbf0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
dc00: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
dc10: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
dc20: 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b  f name in zName[
dc30: 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69  ] */..  if( pELi
dc40: 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  st ){.    nCol =
dc50: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
dc60: 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74      aCol = sqlit
dc70: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
dc80: 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30  b, sizeof(aCol[0
dc90: 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65  ])*nCol);.    te
dca0: 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20  stcase( aCol==0 
dcb0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
dcc0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
dcd0: 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  ol = 0;.  }.  *p
dce0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
dcf0: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
dd00: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
dd10: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
dd20: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
dd30: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
dd40: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
dd50: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
dd60: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
dd70: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
dd80: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
dd90: 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61  r);.    if( (zNa
dda0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
ddb0: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
ddc0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
ddd0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
dde0: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
ddf0: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
de00: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
de10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
de20: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
de30: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
de40: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
de50: 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20  *pColExpr = p;  
de60: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
de70: 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65  n that is the re
de80: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
de90: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
dea0: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f  *pTab;         /
deb0: 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74  * Table associat
dec0: 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70  ed with this exp
ded0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
dee0: 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72   while( pColExpr
def0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
df00: 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72          pColExpr
df10: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69   = pColExpr->pRi
df20: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
df30: 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30  ert( pColExpr!=0
df40: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
df50: 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
df60: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
df70: 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72   ALWAYS(pColExpr
df80: 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
df90: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
dfa0: 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c  umns use the col
dfb0: 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f  umn name name */
dfc0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
dfd0: 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43  l = pColExpr->iC
dfe0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
dff0: 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Tab = pColExpr->
e000: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66  pTab;.        if
e010: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
e020: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
e030: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
e040: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
e050: 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20  , "%s",.        
e060: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30           iCol>=0
e070: 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   ? pTab->aCol[iC
e080: 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77  ol].zName : "row
e090: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
e0a0: 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e  e if( pColExpr->
e0b0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
e0c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
e0d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43  prHasProperty(pC
e0e0: 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  olExpr, EP_IntVa
e0f0: 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
e100: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
e110: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
e120: 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f   pColExpr->u.zTo
e130: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
e140: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
e150: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
e160: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
e170: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
e180: 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
e190: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e1a0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e1b0: 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  %s", pEList->a[i
e1c0: 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
e1d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e1e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e1f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e200: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
e210: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
e220: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
e230: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
e240: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
e250: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
e260: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
e270: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
e280: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
e290: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
e2a0: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
e2b0: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65      */.    nName
e2c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e2d0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  30(zName);.    f
e2e0: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
e2f0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
e300: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e310: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
e320: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
e330: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61      char *zNewNa
e340: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  me;.        int 
e350: 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b  k;.        for(k
e360: 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26  =nName-1; k>1 &&
e370: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
e380: 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b  zName[k]); k--){
e390: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e  }.        if( k>
e3a0: 3d 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d  =0 && zName[k]==
e3b0: 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b  ':' ) nName = k;
e3c0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e  .        zName[n
e3d0: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
e3e0: 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71     zNewName = sq
e3f0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
e400: 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%s:%d", zName,
e410: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
e420: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e430: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
e440: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e     zName = zNewN
e450: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  ame;.        j =
e460: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
e470: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
e480: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
e490: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
e4a0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20   = zName;.  }.  
e4b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
e4c0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
e4d0: 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
e4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e4f0: 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
e500: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
e510: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e520: 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
e530: 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
e540: 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
e550: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e560: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
e570: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e580: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
e590: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
e5a0: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
e5b0: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
e5c0: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
e5d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
e5e0: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
e5f0: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
e600: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
e610: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
e620: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
e630: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
e640: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
e650: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
e660: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
e670: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
e680: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
e690: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
e6a0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
e6b0: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
e6c0: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
e6d0: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
e6e0: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
e6f0: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73  e resolved..*/.s
e700: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
e710: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
e720: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
e730: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e740: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e750: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62  ontexts */.  Tab
e760: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
e770: 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e     /* Add column
e780: 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f   type informatio
e790: 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  n to this table 
e7a0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
e7b0: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
e7c0: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
e7d0: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
e7e0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
e7f0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
e800: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
e810: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
e820: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
e830: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
e840: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
e850: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
e860: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
e870: 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20  ;.  u64 szAll = 
e880: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
e890: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
e8a0: 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
e8b0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
e8c0: 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
e8d0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
e8e0: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
e8f0: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
e900: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e910: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
e920: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
e930: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
e940: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
e950: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
e960: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
e970: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
e980: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
e990: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
e9a0: 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  b->aCol; i<pTab-
e9b0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
e9c0: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69  ++){.    p = a[i
e9d0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
e9e0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20   pCol->zType==0 
e9f0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
ea00: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
ea10: 53 74 72 44 75 70 28 64 62 2c 20 0a 20 20 20 20  StrDup(db, .    
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 20 20 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26      columnType(&
ea40: 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70  sNC, p,0,0,0, &p
ea50: 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20  Col->szEst));.  
ea60: 20 20 7d 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d    }.    szAll +=
ea70: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20   pCol->szEst;.  
ea80: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
ea90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
eaa0: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69  finity(p);.    i
eab0: 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  f( pCol->affinit
eac0: 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66  y==0 ) pCol->aff
ead0: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
eae0: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f  FF_BLOB;.    pCo
eaf0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
eb00: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
eb10: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
eb20: 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  l && pCol->zColl
eb30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  ==0 ){.      pCo
eb40: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
eb50: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
eb60: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
eb70: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
eb80: 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74  szTabRow = sqlit
eb90: 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34  e3LogEst(szAll*4
eba0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
ebb0: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
ebc0: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
ebd0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
ebe0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
ebf0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
ec00: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
ec10: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
ec20: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
ec30: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
ec40: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
ec50: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
ec60: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
ec70: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ec80: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
ec90: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
eca0: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
ecb0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
ecc0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
ecd0: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
ece0: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
ecf0: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
ed00: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
ed10: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
ed20: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
ed30: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
ed40: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
ed50: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
ed60: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
ed70: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
ed80: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
ed90: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
eda0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
edb0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
edc0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
edd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ede0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
edf0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
ee00: 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
ee10: 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
ee20: 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
ee30: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
ee40: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
ee50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
ee60: 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54  abled==0 );.  pT
ee70: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
ee80: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
ee90: 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  .  pTab->nRowLog
eea0: 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
eeb0: 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
eec0: 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
eed0: 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  ;.  selectColumn
eee0: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
eef0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
ef00: 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
ef10: 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
ef20: 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  ;.  selectAddCol
ef30: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
ef40: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
ef50: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
ef60: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
ef70: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
ef80: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
ef90: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
efa0: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
efb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
efc0: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
efd0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
efe0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
eff0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
f000: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
f010: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
f020: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f030: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
f040: 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
f050: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
f060: 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
f070: 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
f080: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
f090: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
f0a0: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
f0b0: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
f0c0: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
f0d0: 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
f0e0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 20 29  se);.    if( v )
f0f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f100: 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a  p0(v, OP_Init);.
f110: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
f120: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20  pToplevel==0.   
f130: 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
f140: 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d  nEnabled(pParse-
f150: 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f  >db,SQLITE_Facto
f160: 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20 20 29  rOutConst).    )
f170: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
f180: 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
f190: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20  1;.    }..  }.  
f1a0: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a  return v;.}.../*
f1b0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
f1c0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
f1d0: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
f1e0: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
f1f0: 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
f200: 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
f210: 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20  ssions.  pLimit 
f220: 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64  and pOffset hold
f230: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
f240: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
f250: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
f260: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
f270: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
f280: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
f290: 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
f2a0: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
f2b0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
f2c0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
f2d0: 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
f2e0: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
f2f0: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
f300: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
f310: 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
f320: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
f330: 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
f340: 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
f350: 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
f360: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
f370: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
f380: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
f390: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
f3a0: 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d  e values of iLim
f3b0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
f3c0: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
f3d0: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
f3e0: 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74  efined by pLimit
f3f0: 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69   and pOffset.  i
f400: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
f410: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
f420: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
f430: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
f440: 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f  ult values (zero
f450: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
f460: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
f470: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f  ne..**.** The iO
f480: 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28  ffset register (
f490: 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
f4a0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
f4b0: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
f4c0: 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65  the OFFSET.  The
f4d0: 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72   iLimit register
f4e0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
f4f0: 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73  to LIMIT.  Regis
f500: 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31  ter.** iOffset+1
f510: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
f520: 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e  to LIMIT+OFFSET.
f530: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  .**.** Only if p
f540: 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
f550: 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
f560: 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
f570: 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
f580: 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
f590: 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
f5a0: 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
f5b0: 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
f5c0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
f5d0: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
f5e0: 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
f5f0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
f600: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
f610: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
f620: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
f630: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
f640: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
f650: 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
f660: 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
f670: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
f680: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
f690: 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20  addr1, n;.  if( 
f6a0: 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75  p->iLimit ) retu
f6b0: 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rn;..  /* .  ** 
f6c0: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
f6d0: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
f6e0: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
f6f0: 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73  .  ** controvers
f700: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
f710: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
f720: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
f730: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
f740: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
f750: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
f760: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
f770: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73  o rows..  */.  s
f780: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
f790: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
f7a0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
f7b0: 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d  et==0 || p->pLim
f7c0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  it!=0 );.  if( p
f7d0: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
f7e0: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  p->iLimit = iLim
f7f0: 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
f800: 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
f810: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f820: 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  se);.    assert(
f830: 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   v!=0 );.    if(
f840: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
f850: 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  teger(p->pLimit,
f860: 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
f870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f880: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
f890: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
f8a0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f8b0: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
f8c0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
f8d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
f8e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f8f0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
f900: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65  Break);.      }e
f910: 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20  lse if( n>=0 && 
f920: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75  p->nSelectRow>(u
f930: 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  64)n ){.        
f940: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
f950: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
f960: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
f970: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
f980: 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69  se, p->pLimit, i
f990: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
f9a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f9b0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
f9c0: 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
f9d0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
f9e0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f9f0: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
fa00: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
fa10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fa20: 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c  P_IfNot, iLimit,
fa30: 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
fa40: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
fa50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
fa60: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
fa70: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
fa80: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
fa90: 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
faa0: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
fab0: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
fac0: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
fad0: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
fae0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
faf0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
fb00: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
fb10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fb20: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fb30: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
fb40: 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
fb50: 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
fb60: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
fb70: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
fb80: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
fb90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fba0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
fbb0: 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72  fset); VdbeCover
fbc0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
fbd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fbe0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
fbf0: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
fc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
fc10: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
fc20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fc30: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
fc40: 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66  dd, iLimit, iOff
fc50: 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b  set, iOffset+1);
fc60: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
fc70: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46  nt((v, "LIMIT+OF
fc80: 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61  FSET"));.      a
fc90: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
fca0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
fcb0: 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 20 56  fPos, iLimit); V
fcc0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fcd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fce0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
fcf0: 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73  teger, -1, iOffs
fd00: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  et+1);.      sql
fd10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fd20: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
fd30: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
fd40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
fd50: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
fd60: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
fd70: 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
fd80: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
fd90: 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
fda0: 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
fdb0: 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
fdc0: 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
fdd0: 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
fde0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
fdf0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
fe00: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
fe10: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
fe20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
fe30: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
fe40: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
fe50: 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
fe60: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
fe70: 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
fe80: 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
fe90: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
fea0: 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
feb0: 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
fec0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
fed0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
fee0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
fef0: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
ff00: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
ff10: 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
ff20: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
ff30: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
ff40: 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
ff50: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
ff60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
ff70: 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20  t( iCol>=0 );.  
ff80: 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20  /* iCol must be 
ff90: 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c  less than p->pEL
ffa0: 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68  ist->nExpr.  Oth
ffb0: 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
ffc0: 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20  would.  ** have 
ffd0: 62 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69  been thrown duri
ffe0: 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ng name resoluti
fff0: 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  on and we would 
10000 6e 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a  not have gotten.
10010 20 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f    ** this far */
10020 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
10030 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d  & ALWAYS(iCol<p-
10040 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
10050 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
10060 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
10070 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
10080 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
10090 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
100a0 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
100b0 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
100c0 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
100d0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
100e0 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ter is a compoun
100f0 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  d SELECT.** with
10100 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
10110 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  use. This functi
10120 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on allocates and
10130 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e   returns a KeyIn
10140 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
10150 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70  suitable for imp
10160 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
10170 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70  DER BY..**.** Sp
10180 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
10190 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
101a0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
101b0 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63  om malloc. The c
101c0 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
101d0 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
101e0 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
101f0 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
10200 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
10210 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
10220 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75  atic KeyInfo *mu
10230 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
10240 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  KeyInfo(Parse *p
10250 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
10260 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20  , int nExtra){. 
10270 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
10280 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
10290 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  y;.  int nOrderB
102a0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  y = p->pOrderBy-
102b0 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65  >nExpr;.  sqlite
102c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
102d0 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  db;.  KeyInfo *p
102e0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Ret = sqlite3Key
102f0 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f  InfoAlloc(db, nO
10300 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31  rderBy+nExtra, 1
10310 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
10320 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10330 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
10340 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
10350 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
10360 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
10370 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a  pOrderBy->a[i];.
10380 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
10390 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  m = pItem->pExpr
103a0 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
103b0 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69  *pColl;..      i
103c0 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
103d0 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
103e0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
103f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
10400 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  eq(pParse, pTerm
10410 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10420 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
10430 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
10440 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49  eq(pParse, p, pI
10450 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
10460 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  yCol-1);.       
10470 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
10480 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
10490 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  tColl;.        p
104a0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
104b0 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
104c0 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
104d0 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
104e0 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c  se, pTerm, pColl
104f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
10500 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
10510 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
10520 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20  Writeable(pRet) 
10530 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61  );.      pRet->a
10540 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
10550 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f  .      pRet->aSo
10560 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
10570 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
10580 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
10590 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
105a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
105b0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
105c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
105d0 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f  enerates VDBE co
105e0 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  de to compute th
105f0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
10600 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a  ITH RECURSIVE.**
10610 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
10620 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63  rm:.**.**   <rec
10630 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53  ursive-table> AS
10640 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20   (<setup-query> 
10650 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63  UNION [ALL] <rec
10660 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a  ursive-query>).*
10670 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10680 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
10690 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
106a0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
106b0 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20     p->pPrior    
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65    p.**.**.** The
10700 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  re is exactly on
10710 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
10720 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  he recursive-tab
10730 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
10740 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75  lause.** of recu
10750 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72  rsive-query, mar
10760 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63  ked with the Src
10770 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65 63 75  List->a[].isRecu
10780 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a  rsive flag..**.*
10790 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72  * The setup-quer
107a0 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67  y runs once to g
107b0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69  enerate an initi
107c0 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74  al set of rows t
107d0 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61  hat go.** into a
107e0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52   Queue table.  R
107f0 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ows are extracte
10800 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65  d from the Queue
10810 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a   table one by.**
10820 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20   one.  Each row 
10830 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
10840 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74  ueue is output t
10850 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74  o pDest.  Then t
10860 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74  he single.** ext
10870 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20  racted row (now 
10880 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20  in the iCurrent 
10890 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74  table) becomes t
108a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
108b0 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74  e.** recursive-t
108c0 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72  able for a recur
108d0 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20  sive-query run. 
108e0 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   The output of t
108f0 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  he recursive-que
10900 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62  ry.** is added b
10910 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ack into the Que
10920 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20  ue table.  Then 
10930 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65  another row is e
10940 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
10950 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  eue.** and the i
10960 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  teration continu
10970 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  es until the Que
10980 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  ue table is empt
10990 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
109a0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f  compound query o
109b0 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
109c0 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61   then no duplica
109d0 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72  te rows are ever
109e0 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
109f0 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
10a00 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63  e.  The iDistinc
10a10 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20  t table keeps a 
10a20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73  copy of all rows
10a30 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76  .** that have ev
10a40 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  er been inserted
10a50 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20   into Queue and 
10a60 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65  causes duplicate
10a70 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61  s to be.** disca
10a80 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70  rded.  If the op
10a90 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
10aa0 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63  ALL, then duplic
10ab0 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ates are allowed
10ac0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
10ad0 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44  query has an ORD
10ae0 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72  ER BY, then entr
10af0 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  ies in the Queue
10b00 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20   table are kept 
10b10 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f  in.** ORDER BY o
10b20 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72  rder and the fir
10b30 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72  st entry is extr
10b40 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63  acted for each c
10b50 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a  ycle.  Without.*
10b60 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  * an ORDER BY, t
10b70 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
10b80 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a  s just a FIFO..*
10b90 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20  *.** If a LIMIT 
10ba0 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64  clause is provid
10bb0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ed, then the ite
10bc0 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74  ration stops aft
10bd0 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a  er LIMIT rows.**
10be0 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75   have been outpu
10bf0 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c  t to pDest.  A L
10c00 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61  IMIT of zero mea
10c10 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20  ns to output no 
10c20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65  rows and a.** ne
10c30 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61  gative LIMIT mea
10c40 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c  ns to output all
10c50 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65   rows.  If there
10c60 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53   is also an OFFS
10c70 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74  ET clause.** wit
10c80 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  h a positive val
10c90 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ue, then the fir
10ca0 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74  st OFFSET output
10cb0 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  s are discarded 
10cc0 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62  rather.** than b
10cd0 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65  eing sent to pDe
10ce0 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63  st.  The LIMIT c
10cf0 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  ount does not be
10d00 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20  gin until after 
10d10 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68  OFFSET.** rows h
10d20 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
10d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10d40 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
10d50 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50  ursiveQuery(.  P
10d60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10d70 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
10d80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
10d90 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
10da0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73     /* The recurs
10db0 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65  ive SELECT to be
10dc0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
10dd0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
10de0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
10df0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
10e00 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  ts */.){.  SrcLi
10e10 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
10e20 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
10e30 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
10e40 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65  he recursive que
10e50 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ry */.  int nCol
10e60 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
10e70 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  xpr;  /* Number 
10e80 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
10e90 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  e recursive tabl
10ea0 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
10eb0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
10ec0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
10ed0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
10ee0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10ef0 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
10f00 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f  Setup = p->pPrio
10f10 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75  r;   /* The setu
10f20 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  p query */.  int
10f30 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
10f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
10f50 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  p of the loop */
10f60 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c  .  int addrCont,
10f70 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20   addrBreak;     
10f80 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64   /* CONTINUE and
10f90 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73   BREAK addresses
10fa0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65   */.  int iCurre
10fb0 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
10fc0 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65      /* The Curre
10fd0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
10fe0 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20  t regCurrent;   
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11000 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
11010 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
11020 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20  .  int iQueue;  
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61   /* The Queue ta
11050 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69  ble */.  int iDi
11060 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20  stinct = 0;     
11070 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73         /* To ens
11080 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c  ure unique resul
11090 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20  ts if UNION */. 
110a0 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54   int eDest = SRT
110b0 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  _Fifo;         /
110c0 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74  * How to write t
110d0 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c  o Queue */.  Sel
110e0 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75  ectDest destQueu
110f0 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
11100 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74  lectDest targett
11110 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61  ing the Queue ta
11120 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
11150 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
11160 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11180 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78  ult code */.  Ex
11190 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
111a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
111b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
111c0 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  se */.  Expr *pL
111d0 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
111e0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c        /* Saved L
111f0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
11200 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
11210 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20  t, regOffset;   
11220 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
11230 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e  used by LIMIT an
11240 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f  d OFFSET */..  /
11250 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69  * Obtain authori
11260 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72  zation to do a r
11270 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
11280 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
11290 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
112a0 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
112b0 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  E, 0, 0, 0) ) re
112c0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  turn;..  /* Proc
112d0 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ess the LIMIT an
112e0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
112f0 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20  , if they exist 
11300 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d  */.  addrBreak =
11310 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11320 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
11330 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
11340 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64  s(pParse, p, add
11350 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69  rBreak);.  pLimi
11360 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
11370 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
11380 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69  ffset;.  regLimi
11390 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
113a0 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
113b0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
113c0 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  imit = p->pOffse
113d0 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d  t = 0;.  p->iLim
113e0 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20  it = p->iOffset 
113f0 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  = 0;.  pOrderBy 
11400 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
11410 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
11420 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
11430 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   the Current tab
11440 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  le */.  for(i=0;
11450 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e   ALWAYS(i<pSrc->
11460 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  nSrc); i++){.   
11470 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e   if( pSrc->a[i].
11480 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  isRecursive ){. 
11490 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20       iCurrent = 
114a0 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
114b0 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  or;.      break;
114c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
114d0 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
114e0 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75  s numbers for Qu
114f0 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74  eue and Distinct
11500 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
11510 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68  mber for.  ** th
11520 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65  e Distinct table
11530 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
11540 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
11550 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72  n Queue in order
11560 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52  .  ** for the SR
11570 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53  T_DistFifo and S
11580 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73  RT_DistQueue des
11590 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72  tinations to wor
115a0 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d  k. */.  iQueue =
115b0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
115c0 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
115d0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44  _UNION ){.    eD
115e0 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
115f0 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a   SRT_DistQueue :
11600 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20   SRT_DistFifo;. 
11610 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70     iDistinct = p
11620 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
11630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73   }else{.    eDes
11640 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53  t = pOrderBy ? S
11650 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46  RT_Queue : SRT_F
11660 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ifo;.  }.  sqlit
11670 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
11680 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65  (&destQueue, eDe
11690 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  st, iQueue);..  
116a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
116b0 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c  ors for Current,
116c0 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74   Queue, and Dist
116d0 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75  inct. */.  regCu
116e0 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65  rrent = ++pParse
116f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
11700 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11710 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43  P_OpenPseudo, iC
11720 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65  urrent, regCurre
11730 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28  nt, nCol);.  if(
11740 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
11750 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
11760 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  fo = multiSelect
11770 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
11780 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
11790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
117a0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
117b0 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
117c0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
117d0 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
117f0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
11800 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64  _KEYINFO);.    d
11810 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42  estQueue.pOrderB
11820 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11830 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
11840 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11850 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
11860 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b  , iQueue, nCol);
11870 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65  .  }.  VdbeComme
11880 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61  nt((v, "Queue ta
11890 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44  ble"));.  if( iD
118a0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70  istinct ){.    p
118b0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
118c0 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
118d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
118e0 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74  Ephemeral, iDist
118f0 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  inct, 0);.    p-
11900 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
11910 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
11920 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20   }..  /* Detach 
11930 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11940 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d  use from the com
11950 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
11960 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
11970 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74  0;..  /* Store t
11980 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
11990 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e  e setup-query in
119a0 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65   Queue. */.  pSe
119b0 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  tup->pNext = 0;.
119c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
119d0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
119e0 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
119f0 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  ;.  pSetup->pNex
11a00 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20  t = p;.  if( rc 
11a10 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65  ) goto end_of_re
11a20 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a  cursive_query;..
11a30 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
11a40 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75  xt row in the Qu
11a50 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74  eue and output t
11a60 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64  hat row */.  add
11a70 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
11a80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
11a90 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61  ewind, iQueue, a
11aa0 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
11ab0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
11ac0 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e  * Transfer the n
11ad0 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65  ext row in Queue
11ae0 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74   over to Current
11af0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
11b00 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
11b10 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29  llRow, iCurrent)
11b20 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f  ; /* To reset co
11b30 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  lumn cache */.  
11b40 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
11b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11b60 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
11b70 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  mn, iQueue, pOrd
11b80 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
11b90 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65  egCurrent);.  }e
11ba0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
11bb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11bc0 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65  _RowData, iQueue
11bd0 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
11be0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
11bf0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
11c00 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  ete, iQueue);.. 
11c10 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
11c20 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
11c30 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f  rent */.  addrCo
11c40 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
11c50 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
11c60 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65  codeOffset(v, re
11c70 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  gOffset, addrCon
11c80 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  t);.  selectInne
11c90 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
11ca0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72   p->pEList, iCur
11cb0 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30  rent,.      0, 0
11cc0 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e  , pDest, addrCon
11cd0 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
11ce0 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b   if( regLimit ){
11cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11d00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
11d10 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69  rJumpZero, regLi
11d20 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  mit, addrBreak);
11d30 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
11d40 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
11d50 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11d60 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29  bel(v, addrCont)
11d70 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  ;..  /* Execute 
11d80 74 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  the recursive SE
11d90 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20  LECT taking the 
11da0 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
11db0 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68  rrent as.  ** th
11dc0 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
11dd0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e  recursive-table.
11de0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11df0 74 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e  ts in the Queue.
11e00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
11e10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
11e20 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71  regate ){.    sq
11e30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11e40 61 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65  arse, "recursive
11e50 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
11e60 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  es not supported
11e70 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
11e80 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
11e90 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
11ea0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
11eb0 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73  stQueue);.    as
11ec0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
11ed0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  =0 );.    p->pPr
11ee0 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20  ior = pSetup;.  
11ef0 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e  }..  /* Keep run
11f00 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e  ning the loop un
11f10 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73  til the Queue is
11f20 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69   empty */.  sqli
11f30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11f40 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
11f50 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  rTop);.  sqlite3
11f60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11f70 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
11f80 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76  .end_of_recursiv
11f90 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74  e_query:.  sqlit
11fa0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
11fb0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
11fc0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e  pOrderBy);.  p->
11fd0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
11fe0 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  rBy;.  p->pLimit
11ff0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e   = pLimit;.  p->
12000 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
12010 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  t;.  return;.}.#
12020 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12030 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20  OMIT_CTE */../* 
12040 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
12050 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
12060 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
12070 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
12080 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
12090 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
120a0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
120b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
120c0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
120d0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
120e0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
120f0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
12100 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
12110 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
12120 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e  */.);../*.** Han
12130 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  dle the special 
12140 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75  case of a compou
12150 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
12160 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
12170 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73  .** VALUES claus
12180 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20  e.  By handling 
12190 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61  this as a specia
121a0 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64  l case, we avoid
121b0 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69   deep.** recursi
121c0 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20  on, and thus do 
121d0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f  not need to enfo
121e0 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  rce the SQLITE_L
121f0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
12200 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c  LECT.** on a VAL
12210 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  UES clause..**.*
12220 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65  * Because the Se
12230 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67  lect object orig
12240 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41  inates from a VA
12250 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20  LUES clause:.** 
12260 20 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20    (1) It has no 
12270 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a  LIMIT or OFFSET.
12280 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72  **   (2) All ter
12290 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c  ms are UNION ALL
122a0 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20  .**   (3) There 
122b0 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
122c0 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  lause.*/.static 
122d0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56  int multiSelectV
122e0 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a  alues(.  Parse *
122f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12300 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
12310 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
12320 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12330 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
12340 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
12350 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
12360 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
12370 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
12380 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
12390 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  s */.){.  Select
123a0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20   *pPrior;.  int 
123b0 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20  nRow = 1;.  int 
123c0 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
123d0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
123e0 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b  SF_MultiValue );
123f0 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72  .  do{.    asser
12400 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
12410 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20   SF_Values );.  
12420 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
12430 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f  =TK_ALL || (p->o
12440 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
12450 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b  p->pPrior==0) );
12460 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12470 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20  pLimit==0 );.   
12480 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
12490 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  set==0 );.    as
124a0 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
124b0 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  0 || p->pEList->
124c0 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d  nExpr==p->pNext-
124d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
124e0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
124f0 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ior==0 ) break;.
12500 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12510 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
12520 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  );.    p = p->pP
12530 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b  rior;.    nRow++
12540 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20  ;.  }while(1);. 
12550 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
12560 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
12570 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  ior;.    p->pPri
12580 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  or = 0;.    rc =
12590 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
125a0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
125b0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
125c0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66  = pPrior;.    if
125d0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
125e0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
125f0 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
12600 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
12610 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12620 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12630 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
12640 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
12650 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
12660 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
12670 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
12680 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
12690 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
126a0 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
126b0 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
126c0 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
126d0 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
126e0 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
126f0 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
12700 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
12710 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
12720 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
12730 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
12740 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
12750 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
12760 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
12770 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
12780 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
12790 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
127a0 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
127b0 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
127c0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
127d0 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
127e0 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
127f0 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
12800 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
12810 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
12820 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
12830 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
12840 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
12850 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
12860 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
12870 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
12880 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
12890 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
128a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
128b0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
128c0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
128d0 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
128e0 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
128f0 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
12910 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
12920 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
12930 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
12940 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
12950 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
12960 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
12970 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
12980 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12990 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
129a0 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
129b0 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
129c0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
129d0 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
129e0 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
129f0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
12a00 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
12a10 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
12a20 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
12a30 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
12a40 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
12a50 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
12a60 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
12a70 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
12a80 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
12a90 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
12aa0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12ab0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12ac0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12ad0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
12ae0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
12af0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
12b00 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
12b10 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
12b20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
12b30 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
12b40 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
12b50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
12b60 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
12b70 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
12b80 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
12b90 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
12ba0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
12bb0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
12bc0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
12bd0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
12be0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
12bf0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
12c00 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
12c10 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
12c20 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
12c30 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
12c40 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
12c50 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
12c60 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
12c70 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
12c80 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
12c90 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
12ca0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
12cb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12cc0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
12cd0 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20  nt iSub1 = 0;   
12ce0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
12cf0 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
12d00 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
12d10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
12d20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
12d30 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
12d40 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
12d50 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
12d60 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
12d70 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
12d80 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
12d90 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
12da0 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
12db0 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
12dc0 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
12dd0 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
12de0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12df0 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
12e00 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
12e10 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
12e20 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
12e30 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
12e40 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
12e50 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
12e60 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
12e70 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
12e80 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
12e90 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
12ea0 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20  >pPrior;.  dest 
12eb0 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
12ec0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
12ed0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12ee0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
12ef0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
12f00 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
12f10 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
12f20 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
12f30 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
12f40 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
12f50 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
12f60 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
12f70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
12f80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12f90 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
12fa0 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
12fb0 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
12fc0 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
12fd0 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
12fe0 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
12ff0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
13000 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13010 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   }..  v = sqlite
13020 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13030 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
13040 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45   );  /* The VDBE
13050 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
13060 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63   by calling func
13070 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72  tion */..  /* Cr
13080 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
13090 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
130a0 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
130b0 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  y.  */.  if( des
130c0 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  t.eDest==SRT_Eph
130d0 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  emTab ){.    ass
130e0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
130f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13100 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
13110 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73  enEphemeral, des
13120 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45  t.iSDParm, p->pE
13130 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
13140 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13150 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
13160 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64  NORDERED);.    d
13170 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
13180 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
13190 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   Special handlin
131a0 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  g for a compound
131b0 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69  -select that ori
131c0 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c  ginates as a VAL
131d0 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f  UES clause..  */
131e0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
131f0 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
13200 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  ue ){.    rc = m
13210 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73  ultiSelectValues
13220 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
13230 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c  t);.    goto mul
13240 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13250 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
13260 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
13270 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
13280 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
13290 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
132a0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
132b0 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
132c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
132d0 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
132e0 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65  pEList );.  asse
132f0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rt( p->pEList->n
13300 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr==pPrior->pE
13310 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a  List->nExpr );..
13320 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13330 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d  MIT_CTE.  if( p-
13340 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
13350 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
13360 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
13370 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73  rsiveQuery(pPars
13380 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
13390 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
133a0 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  /* Compound SELE
133b0 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e  CTs that have an
133c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
133d0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
133e0 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  arately..  */.  
133f0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
13400 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
13410 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
13420 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
13430 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f  t);.  }else..  /
13440 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13450 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
13460 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
13470 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
13480 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
13490 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
134a0 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
134b0 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
134c0 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  nt nLimit;.     
134d0 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
134e0 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
134f0 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
13500 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
13510 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66      pPrior->iOff
13520 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
13530 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
13540 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
13550 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
13560 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
13570 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78  Offset;.      ex
13580 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
13590 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
135a0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
135b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
135c0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
135d0 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a  pPrior, &dest);.
135e0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
135f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  = 0;.      p->pO
13600 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
13610 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13620 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
13630 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
13640 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
13650 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
13660 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
13670 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
13680 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
13690 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
136a0 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
136b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
136c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
136d0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
136e0 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64  , p->iLimit); Vd
136f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
13700 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
13710 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
13720 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
13730 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  hed"));.      }.
13740 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
13750 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
13760 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
13770 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
13780 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
13790 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
137a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
137b0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
137c0 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
137d0 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
137e0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
137f0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
13800 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
13810 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
13820 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ow;.      if( pP
13830 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20  rior->pLimit.   
13840 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
13850 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72 69  prIsInteger(pPri
13860 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69  or->pLimit, &nLi
13870 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e  mit).       && n
13880 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53  Limit>0 && p->nS
13890 65 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29  electRow > (u64)
138a0 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b  nLimit .      ){
138b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
138c0 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b  ectRow = nLimit;
138d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
138e0 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
138f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
13900 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
13910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13920 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13930 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
13940 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
13950 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
13960 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
13970 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
13980 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
13990 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
139a0 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f  lt */.      u8 o
139b0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  p = 0;       /* 
139c0 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
139d0 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
139e0 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
139f0 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
13a00 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
13a10 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
13a20 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
13a30 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
13a40 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
13a50 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
13a60 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
13a70 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
13a80 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
13a90 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
13aa0 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
13ab0 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ;..      testcas
13ac0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
13ad0 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  EPT );.      tes
13ae0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
13af0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
13b00 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e  priorOp = SRT_Un
13b10 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ion;.      if( d
13b20 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72  est.eDest==prior
13b30 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Op ){.        /*
13b40 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
13b50 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13b60 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
13b70 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
13b80 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
13b90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13ba0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
13bb0 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  mit==0 );      /
13bc0 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
13bd0 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
13be0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
13bf0 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
13c00 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f  ==0 );     /* No
13c10 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
13c20 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
13c30 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
13c40 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
13c50 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
13c60 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
13c70 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
13c80 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
13c90 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
13ca0 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
13cb0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
13cc0 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
13cd0 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
13ce0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
13cf0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
13d00 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
13d10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
13d20 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
13d30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
13d40 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
13d50 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
13d60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
13d70 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
13d80 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
13d90 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
13da0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
13db0 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
13dc0 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
13dd0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
13de0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13df0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
13e00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
13e10 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
13e20 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
13e30 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
13e40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
13e50 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
13e60 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
13e70 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
13e80 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
13e90 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
13ea0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
13eb0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
13ec0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
13ed0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
13ee0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
13ef0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
13f00 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
13f10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
13f20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
13f30 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
13f40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
13f50 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
13f60 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
13f70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13f80 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  f( p->op==TK_EXC
13f90 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EPT ){.        o
13fa0 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
13fb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13fc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13fd0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
13fe0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
13ff0 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a  _Union;.      }.
14000 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
14010 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
14020 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
14030 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
14040 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
14050 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
14060 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14070 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f   = 0;.      unio
14080 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70  ndest.eDest = op
14090 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
140a0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
140b0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
140c0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
140d0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
140e0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e  t(pParse, p, &un
140f0 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
14100 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14110 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14120 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
14130 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
14140 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
14150 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
14160 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
14170 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
14180 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
14190 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
141a0 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
141b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
141c0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
141d0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
141e0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
141f0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
14200 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
14210 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
14220 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
14230 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
14240 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  ION ) p->nSelect
14250 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
14260 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
14270 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
14280 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
14290 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
142a0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
142b0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
142c0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
142d0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
142e0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
142f0 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   0;..      /* Co
14300 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
14310 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
14320 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
14330 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
14340 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
14350 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
14360 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
14370 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d  ssert( unionTab=
14380 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c  =dest.iSDParm ||
14390 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
143a0 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66  orOp );.      if
143b0 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
143c0 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
143d0 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
143e0 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
143f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14400 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
14410 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
14420 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
14430 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
14440 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
14450 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
14460 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
14470 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
14480 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
14490 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
144a0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
144b0 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
144c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
144d0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
144e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
144f0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
14500 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
14510 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14520 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
14530 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
14540 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
14550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14560 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14570 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
14580 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  b, iBreak); Vdbe
14590 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
145a0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
145b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
145c0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
145d0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
145e0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
145f0 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
14600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14610 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
14620 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
14630 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
14640 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
14650 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
14660 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14670 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14680 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
14690 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
146a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
146b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
146c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
146d0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
146e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
146f0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
14700 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
14710 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
14720 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
14730 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  lt: assert( p->o
14740 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
14750 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  ); {.      int t
14760 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
14770 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
14780 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
14790 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
147a0 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
147b0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
147c0 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
147d0 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
147e0 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f  int r1;..      /
147f0 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
14800 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
14810 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
14820 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
14830 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
14840 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
14850 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
14860 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
14870 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
14880 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
14890 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
148a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
148b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
148c0 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
148d0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
148e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
148f0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
14900 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
14910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14920 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
14930 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ral, tab1, 0);. 
14940 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14950 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
14960 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
14970 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
14980 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
14990 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
149a0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
149b0 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
149c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
149d0 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
149e0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
149f0 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
14a00 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
14a10 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
14a20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
14a30 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
14a40 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
14a50 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
14a60 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  ab1);.      expl
14a70 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14a80 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
14a90 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14ab0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
14ac0 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
14ad0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
14ae0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
14af0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
14b00 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
14b10 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14b20 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
14b30 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
14b40 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
14b50 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
14b60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14b70 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
14b80 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
14b90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14ba0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14bb0 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
14bc0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
14bd0 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
14be0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14bf0 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
14c00 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
14c10 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14c20 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
14c30 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
14c40 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14c50 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73   0;.      inters
14c60 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20  ectdest.iSDParm 
14c70 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78  = tab2;.      ex
14c80 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
14c90 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
14ca0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
14cb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14cc0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14cd0 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
14ce0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
14cf0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
14d00 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
14d10 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
14d20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
14d30 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
14d40 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
14d50 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
14d60 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
14d70 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
14d80 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
14d90 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
14da0 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
14db0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
14dc0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
14dd0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
14de0 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20  pOffset;..      
14df0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14e00 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
14e10 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
14e20 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
14e30 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
14e40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
14e50 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
14e60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
14e70 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
14e80 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
14e90 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
14ea0 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   p;.        whil
14eb0 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
14ec0 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
14ed0 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
14ee0 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
14ef0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
14f00 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
14f10 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
14f20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
14f30 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14f40 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
14f50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
14f60 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
14f70 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
14f80 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
14f90 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
14fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14fb0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
14fc0 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
14fd0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14fe0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
14ff0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15000 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
15010 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
15020 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15030 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29  owKey, tab1, r1)
15040 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15050 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
15060 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
15070 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29  2, iCont, r1, 0)
15080 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15090 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
150a0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
150b0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
150c0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
150d0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
150e0 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20  pEList, tab1,.  
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c      0, 0, &dest,
15110 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
15120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15130 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15140 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
15150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15160 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
15170 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62  b1, iStart); Vdb
15180 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
151a0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
151b0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
151c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
151d0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
151e0 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
151f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15200 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
15210 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
15220 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
15230 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
15240 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20  (pParse, p->op, 
15250 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d  iSub1, iSub2, p-
15260 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20  >op!=TK_ALL);.. 
15270 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
15280 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
15290 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65  used by .  ** te
152a0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
152b0 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
152c0 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
152d0 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
152e0 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
152f0 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
15300 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15310 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
15320 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e  s section is run
15330 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   by the right-mo
15340 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
15350 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53  ent only..  ** S
15360 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
15370 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77   to the left alw
15380 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61  ays skip this pa
15390 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rt.  The right-m
153a0 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ost.  ** SELECT 
153b0 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20  might also skip 
153c0 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20  this part if it 
153d0 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20  has no ORDER BY 
153e0 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20  clause and.  ** 
153f0 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61  no temp tables a
15400 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  re required..  *
15410 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
15420 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68  ags & SF_UsesEph
15430 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e  emeral ){.    in
15440 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
15450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15460 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15470 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
15480 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
15490 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
154a0 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
154b0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
154c0 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20   Select *pLoop; 
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
154e0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
154f0 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61  rough SELECT sta
15500 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43  tements */.    C
15510 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b  ollSeq **apColl;
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15530 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
15540 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  ugh pKeyInfo->aC
15550 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  oll[] */.    int
15560 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
15570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15580 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
15590 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  in result set */
155a0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
155b0 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20  >pNext==0 );.   
155c0 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
155d0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b  t->nExpr;.    pK
155e0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
155f0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
15600 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69   nCol, 1);.    i
15610 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
15620 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15630 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
15640 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
15650 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
15660 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d  for(i=0, apColl=
15670 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
15680 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70   i<nCol; i++, ap
15690 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  Coll++){.      *
156a0 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65  apColl = multiSe
156b0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
156c0 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
156d0 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20   if( 0==*apColl 
156e0 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f  ){.        *apCo
156f0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
15700 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
15710 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
15720 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
15730 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
15740 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15750 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
15760 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
15770 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
15780 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
15790 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
157a0 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
157b0 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
157c0 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
157d0 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
157e0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
157f0 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
15800 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
15810 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
15820 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
15830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
15840 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
15850 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
15860 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
15880 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
15890 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
158a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
158b0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
158c0 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c  addr, (char*)sql
158d0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
158e0 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  KeyInfo),.      
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
15910 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
15920 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
15930 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
15940 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15950 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
15960 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
15970 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
15980 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
15990 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70   dest.iSdst;.  p
159a0 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65  Dest->nSdst = de
159b0 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69  st.nSdst;.  sqli
159c0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
159d0 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20  db, pDelete);.  
159e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
159f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
15a00 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
15a10 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72  CT */../*.** Err
15a20 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77  or message for w
15a30 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  hen two or more 
15a40 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f  terms of a compo
15a50 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20  und select have 
15a60 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a  different.** siz
15a70 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a  e result sets..*
15a80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
15a90 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
15aa0 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50  sError(Parse *pP
15ab0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
15ac0 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  {.  if( p->selFl
15ad0 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
15ae0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15af0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15b00 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20  all VALUES must 
15b10 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
15b20 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b  mber of terms");
15b30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
15b40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15b50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
15b60 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
15b70 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
15b80 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
15b90 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
15ba0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
15bb0 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
15bc0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a  (p->op));.  }.}.
15bd0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
15be0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
15bf0 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
15c00 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
15c10 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
15c20 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
15c30 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
15c40 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
15c50 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e  d in pIn->iSdst.
15c60 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
15c70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e  In->nSdst column
15c80 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
15c90 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
15ca0 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
15cb0 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
15cc0 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
15cd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
15ce0 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
15cf0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
15d00 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
15d10 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
15d20 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
15d30 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
15d40 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
15d50 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
15d60 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
15d70 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
15d80 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
15d90 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
15da0 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
15db0 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
15dc0 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
15dd0 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
15de0 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
15df0 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
15e00 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
15e10 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
15e20 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
15e30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
15e40 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
15e50 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
15e60 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
15e70 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
15e80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
15e90 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
15ea0 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
15eb0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
15ec0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15ed0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15ee0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15ef0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
15f00 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
15f10 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
15f20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
15f30 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
15f40 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
15f50 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
15f60 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
15f70 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
15f80 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
15f90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
15fa0 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
15fb0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
15fc0 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
15fd0 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
15fe0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
15ff0 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
16000 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
16010 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
16020 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
16030 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
16040 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
16050 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
16060 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
16070 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
16080 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
16090 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
160a0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
160b0 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
160c0 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
160d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
160e0 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
160f0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
16100 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
16110 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
16120 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
16130 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
16140 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
16150 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
16160 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b  .    int j1, j2;
16170 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
16180 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16190 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
161a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
161b0 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c  v);.    j2 = sql
161c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
161d0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
161e0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
161f0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
16200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16220 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
16230 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
16240 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
16250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16260 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
16270 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75  , j2+2, iContinu
16280 65 2c 20 6a 32 2b 32 29 3b 20 56 64 62 65 43 6f  e, j2+2); VdbeCo
16290 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
162a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
162b0 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73  re(v, j1);.    s
162c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
162d0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
162e0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
162f0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
16300 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16310 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16320 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
16330 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
16340 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16350 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
16360 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
16370 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
16380 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
16390 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
163a0 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
163b0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
163c0 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
163d0 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
163e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
163f0 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
16400 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
16410 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
16420 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
16430 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
16440 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
16450 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
16460 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
16470 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16480 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
16490 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
164a0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
164b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
164c0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
164d0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
164e0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
164f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16500 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
16510 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
16520 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
16530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16540 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
16550 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
16560 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
16570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16580 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
16590 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
165a0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
165b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
165c0 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
165d0 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
165e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
165f0 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
16600 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16610 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16620 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
16630 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
16640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
16650 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
16660 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
16670 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
16680 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
16690 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
166a0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
166b0 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
166c0 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
166d0 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
166e0 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
166f0 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
16700 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
16710 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
16720 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
16730 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
16740 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
16750 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72  nSdst==1 || pPar
16760 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20  se->nErr>0 );.  
16770 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
16780 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73  st = .         s
16790 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
167a0 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
167b0 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
167c0 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20  st->affSdst);.  
167d0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
167e0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
167f0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
16800 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16810 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
16820 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c  n->iSdst, 1, r1,
16830 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74   &pDest->affSdst
16840 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ,1);.      sqlit
16850 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
16860 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
16870 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29  , pIn->iSdst, 1)
16880 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
168a0 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
168b0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a  ->iSDParm, r1);.
168c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
168d0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
168e0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
168f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
16900 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
16910 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
16920 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
16930 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
16940 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
16950 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
16960 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
16970 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
16980 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
16990 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
169a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
169b0 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
169c0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
169d0 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72  nSdst==1 || pPar
169e0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74  se->nErr>0 );  t
169f0 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53  estcase( pIn->nS
16a00 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst!=1 );.      
16a10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
16a20 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
16a30 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
16a40 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20  SDParm, 1);.    
16a50 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
16a60 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
16a70 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
16a80 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
16a90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
16aa0 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
16ab0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16ac0 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ERY */..    /* T
16ad0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  he results are s
16ae0 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
16af0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
16b00 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
16b10 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74   at pDest->iSdst
16b20 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72  .  Then the co-r
16b30 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20  outine yields.. 
16b40 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
16b50 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
16b60 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
16b70 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >iSdst==0 ){.   
16b80 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73       pDest->iSds
16b90 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
16ba0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
16bb0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
16bc0 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73       pDest->nSds
16bd0 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a  t = pIn->nSdst;.
16be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
16bf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
16c00 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
16c10 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64  Sdst, pDest->iSd
16c20 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
16c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16c40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
16c50 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
16c60 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
16c70 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
16c80 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
16c90 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
16ca0 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
16cb0 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
16cc0 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
16cd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
16ce0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
16cf0 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
16d00 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
16d10 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
16d20 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
16d30 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
16d40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
16d50 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
16d60 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
16d70 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
16d80 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
16d90 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
16da0 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
16db0 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
16dc0 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
16dd0 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
16de0 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
16df0 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
16e00 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
16e10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
16e20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
16e30 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
16e40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16e50 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
16e60 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  Row, pIn->iSdst,
16e70 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16e80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16e90 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
16ea0 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
16eb0 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
16ec0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
16ed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16ee0 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
16ef0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
16f00 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
16f10 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ched..  */.  if(
16f20 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
16f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16f40 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
16f50 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  mpZero, p->iLimi
16f60 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
16f70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
16f80 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
16f90 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
16fa0 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
16fb0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16fc0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
16fd0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
16fe0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
16ff0 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29  turn, regReturn)
17000 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  ;..  return addr
17010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72  ;.}../*.** Alter
17020 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20  native compound 
17030 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65  select code gene
17040 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20  rator for cases 
17050 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73  when there.** is
17060 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
17070 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  use..**.** We as
17080 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20  sume a query of 
17090 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
170a0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c  rm:.**.**      <
170b0 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61  selectA>  <opera
170c0 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20  tor>  <selectB> 
170d0 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72   ORDER BY <order
170e0 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f  bylist>.**.** <o
170f0 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20  perator> is one 
17100 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e  of UNION ALL, UN
17110 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
17120 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20  INTERSECT.  The 
17130 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f  idea.** is to co
17140 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41  de both <selectA
17150 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20  > and <selectB> 
17160 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  with the ORDER B
17170 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63  Y clause as.** c
17180 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65  o-routines.  The
17190 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75  n run the co-rou
171a0 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65  tines in paralle
171b0 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  l and merge the 
171c0 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
171d0 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20  the output.  In 
171e0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20  addition to the 
171f0 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28  two coroutines (
17200 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61  called selectA a
17210 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74  nd.** selectB) t
17220 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f  here are 7 subro
17230 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  utines:.**.**   
17240 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74   outA:    Move t
17250 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
17260 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69   selectA corouti
17270 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
17280 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
17290 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
172a0 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  d query..**.**  
172b0 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20    outB:    Move 
172c0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
172d0 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74  e selectB corout
172e0 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
172f0 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
17300 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
17310 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79  nd query.  (Only
17320 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55   generated for U
17330 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  NION and.**     
17340 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
17350 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49  L.  EXCEPT and I
17360 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20  NSERTSECT never 
17370 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61  output a row tha
17380 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
17390 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e   appears only in
173a0 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c   B.).**.**    Al
173b0 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
173c0 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
173d0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
173e0 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a  tines and A<B..*
173f0 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20  *.**    AeqB:   
17400 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
17410 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
17420 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
17430 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20  and A==B..**.** 
17440 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c     AgtB:    Call
17450 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
17460 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
17470 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
17480 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  >B..**.**    Eof
17490 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  A:    Called whe
174a0 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
174b0 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  ted from selectA
174c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a  ..**.**    EofB:
174d0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
174e0 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
174f0 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a  d from selectB..
17500 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
17510 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
17520 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72  latter five subr
17530 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f  outines depend o
17540 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65  n which .** <ope
17550 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a  rator> is used:.
17560 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  **.**.**        
17570 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20       UNION ALL  
17580 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20         UNION    
17590 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20          EXCEPT  
175a0 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43          INTERSEC
175b0 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d  T.**          --
175c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
175d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
175e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
175f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17600 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f  -.**   AltB:   o
17610 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17620 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
17630 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
17640 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a        nextA.**.*
17650 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41  *   AeqB:   outA
17660 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
17670 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20  nextA           
17680 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
17690 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a  outA, nextA.**.*
176a0 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42  *   AgtB:   outB
176b0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
176c0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
176d0 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20    nextB         
176e0 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20     nextB.**.**  
176f0 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e   EofA:   outB, n
17700 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
17710 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68  nextB          h
17720 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  alt             
17730 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  halt.**.**   Eof
17740 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
17750 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
17760 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
17770 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74  xtA         halt
17780 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c  .**.** In the Al
17790 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67  tB, AeqB, and Ag
177a0 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20  tB subroutines, 
177b0 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c  an EOF on A foll
177c0 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63  owing nextA.** c
177d0 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61  auses an immedia
177e0 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20  te jump to EofA 
177f0 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20  and an EOF on B 
17800 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20  following nextB 
17810 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d  causes.** an imm
17820 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
17830 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66  ofB.  Within Eof
17840 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20  A and EofB, and 
17850 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a  EOF on entry or.
17860 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78  ** following nex
17870 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70  tX causes a jump
17880 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
17890 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73  he select proces
178a0 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c  sing..**.** Dupl
178b0 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e  icate removal in
178c0 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45   the UNION, EXCE
178d0 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
178e0 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c  T cases is handl
178f0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
17900 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
17910 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76  ne.  The regPrev
17920 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f   register set ho
17930 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  lds the previous
17940 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c  ly.** output val
17950 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f  ue.  A compariso
17960 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73  n is made agains
17970 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64  t this value and
17980 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
17990 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
179a0 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f   next results wo
179b0 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
179c0 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  as the previous.
179d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
179e0 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69  mentation plan i
179f0 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
17a00 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
17a10 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73  s and seven.** s
17a20 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74  ubroutines first
17a30 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63  , then put the c
17a40 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20  ontrol logic at 
17a50 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b  the bottom.  Lik
17a60 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
17a70 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74         goto Init
17a80 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72  .**     coA: cor
17a90 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
17aa0 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20  query (A).**    
17ab0 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coB: coroutine 
17ac0 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20  for right query 
17ad0 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  (B).**    outA: 
17ae0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
17af0 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  f A.**    outB: 
17b00 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
17b10 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55  f B (UNION and U
17b20 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a  NION ALL only).*
17b30 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a  *    EofA: ....*
17b40 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a  *    EofB: ....*
17b50 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a  *    AltB: ....*
17b60 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a  *    AeqB: ....*
17b70 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a  *    AgtB: ....*
17b80 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69  *    Init: initi
17b90 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20  alize coroutine 
17ba0 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20  registers.**    
17bb0 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a        yield coA.
17bc0 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
17bd0 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a  of(A) goto EofA.
17be0 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
17bf0 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20  d coB.**        
17c00 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f    if eof(B) goto
17c10 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72   EofB.**    Cmpr
17c20 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a  : Compare A, B.*
17c30 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20  *          Jump 
17c40 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
17c50 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e  .**     End: ...
17c60 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41  .**.** We call A
17c70 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c  ltB, AeqB, AgtB,
17c80 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20   EofA, and EofB 
17c90 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75  "subroutines" bu
17ca0 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a  t they are not.*
17cb0 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65  * actually calle
17cc0 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e  d using Gosub an
17cd0 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65  d they do not Re
17ce0 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20  turn.  EofA and 
17cf0 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74  EofB loop.** unt
17d00 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65  il all data is e
17d10 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75  xhausted then ju
17d20 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20  mp to the "end" 
17d30 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71  labe.  AltB, Aeq
17d40 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a  B,.** and AgtB j
17d50 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32  ump to either L2
17d60 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f   or to one of Eo
17d70 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23  fA or EofB..*/.#
17d80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17d90 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
17da0 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  CT.static int mu
17db0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
17dc0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17dd0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
17de0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
17df0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
17e00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
17e10 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
17e20 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
17e30 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
17e40 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
17e50 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
17e60 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
17e70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
17e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
17e90 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
17ea0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
17eb0 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
17ec0 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
17ed0 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
17ee0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
17f00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
17f10 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
17f20 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b  electDest destA;
17f30 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
17f40 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
17f50 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  e A */.  SelectD
17f60 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f  est destB;     /
17f70 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
17f80 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f  r coroutine B */
17f90 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b  .  int regAddrA;
17fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17fb0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
17fc0 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
17fd0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
17fe0 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f  AddrB;         /
17ff0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
18000 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20  er for select-B 
18010 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
18020 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20  nt addrSelectA; 
18030 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18040 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20  of the select-A 
18050 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
18060 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20  nt addrSelectB; 
18070 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18080 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20  of the select-B 
18090 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
180a0 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20  nt regOutA;     
180b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
180c0 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
180d0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
180e0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
180f0 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20  gOutB;          
18100 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
18110 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
18120 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
18130 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
18140 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
18150 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
18160 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
18170 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
18180 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41  tB = 0;     /* A
18190 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
181a0 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
181b0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
181c0 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofA;         /* 
181d0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
181e0 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65  elect-A-exhauste
181f0 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
18200 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e    int addrEofA_n
18210 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  oB;     /* Alter
18220 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66  nate addrEofA if
18230 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69   B is uninitiali
18240 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  zed */.  int add
18250 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f  rEofB;         /
18260 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18270 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73   select-B-exhaus
18280 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
18290 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42  /.  int addrAltB
182a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
182b0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20  ress of the A<B 
182c0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
182d0 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20  int addrAeqB;   
182e0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
182f0 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62   of the A==B sub
18300 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18310 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20   addrAgtB;      
18320 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18330 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74   the A>B subrout
18340 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
18350 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f  LimitA;        /
18360 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
18370 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
18380 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42  .  int regLimitB
18390 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
183a0 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
183b0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
183c0 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
183d0 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66     /* A range of
183e0 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f   registers to ho
183f0 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  ld previous outp
18400 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  ut */.  int save
18410 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  dLimit;       /*
18420 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
18430 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69  p->iLimit */.  i
18440 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20  nt savedOffset; 
18450 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
18460 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65  lue of p->iOffse
18470 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  t */.  int label
18480 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Cmpr;        /* 
18490 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74  Label for the st
184a0 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65  art of the merge
184b0 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20   algorithm */.  
184c0 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20  int labelEnd;   
184d0 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
184e0 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
184f0 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54  e overall SELECT
18500 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a   stmt */.  int j
18510 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
18520 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63   /* Jump instruc
18530 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72  tions that get r
18540 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20  etargetted */.  
18550 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
18560 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
18570 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e  TK_ALL, TK_UNION
18580 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f  , TK_EXCEPT, TK_
18590 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b  INTERSECT */.  K
185a0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20  eyInfo *pKeyDup 
185b0 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73  = 0; /* Comparis
185c0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
185d0 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d  or duplicate rem
185e0 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  oval */.  KeyInf
185f0 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20  o *pKeyMerge;   
18600 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
18610 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65  formation for me
18620 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rging rows */.  
18630 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
18640 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
18650 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
18660 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
18670 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
18680 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
18690 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
186a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
186b0 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
186c0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
186d0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  use */.  int *aP
186e0 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f  ermute;        /
186f0 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f  * Mapping from O
18700 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
18710 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75   result set colu
18720 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  mns */.#ifndef S
18730 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
18740 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20  IN.  int iSub1; 
18750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51             /* EQ
18760 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e  P id of left-han
18770 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
18780 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20   iSub2;         
18790 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
187a0 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79  right-hand query
187b0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
187c0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
187d0 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
187e0 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20  ( pKeyDup==0 ); 
187f0 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64  /* "Managed" cod
18800 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54  e needs this.  T
18810 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a  icket #3382. */.
18820 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
18830 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  b;.  v = pParse-
18840 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
18850 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
18860 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77  /* Already throw
18870 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56  n the error if V
18880 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64  DBE alloc failed
18890 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d   */.  labelEnd =
188a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
188b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65  Label(v);.  labe
188c0 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56  lCmpr = sqlite3V
188d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
188e0 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
188f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18900 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
18910 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
18920 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
18930 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
18940 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
18950 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
18960 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
18970 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
18980 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
18990 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
189a0 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
189b0 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
189c0 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
189d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
189e0 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
189f0 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
18a00 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
18a10 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
18a20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
18a30 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
18a40 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
18a50 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
18a60 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
18a70 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
18a80 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
18a90 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
18aa0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
18ab0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
18ac0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
18ad0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
18ae0 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
18af0 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
18b00 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
18b10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
18b20 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
18b30 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
18b40 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e   if( pItem->u.x.
18b50 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29  iOrderByCol==i )
18b60 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
18b70 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72        if( j==nOr
18b80 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
18b90 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
18ba0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
18bb0 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20  _INTEGER, 0);.  
18bc0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
18bd0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
18be0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
18bf0 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
18c00 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20  EP_IntValue;.   
18c10 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
18c20 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  lue = i;.       
18c30 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
18c40 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
18c50 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  d(pParse, pOrder
18c60 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  By, pNew);.     
18c70 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
18c80 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f  ) pOrderBy->a[nO
18c90 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f  rderBy++].u.x.iO
18ca0 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
18cb0 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
18cc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
18cd0 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
18ce0 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
18cf0 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
18d00 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
18d10 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
18d20 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
18d30 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
18d40 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
18d50 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
18d60 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
18d70 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
18d80 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
18d90 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
18da0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
18db0 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
18dc0 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
18dd0 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
18de0 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
18df0 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
18e00 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
18e10 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
18e20 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
18e30 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
18e40 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
18e50 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29  f(int)*nOrderBy)
18e60 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
18e70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
18e80 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
18e90 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  tem;.    for(i=0
18ea0 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
18eb0 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  ->a; i<nOrderBy;
18ec0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
18ed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18ee0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18ef0 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
18f00 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
18f10 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d  .x.iOrderByCol<=
18f20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
18f30 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75   );.      aPermu
18f40 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75  te[i] = pItem->u
18f50 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
18f60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b   1;.    }.    pK
18f70 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53  eyMerge = multiS
18f80 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
18f90 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
18fa0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18fb0 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20  pKeyMerge = 0;. 
18fc0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63   }..  /* Reattac
18fd0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
18fe0 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65  lause to the que
18ff0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ry..  */.  p->pO
19000 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
19010 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72  y;.  pPrior->pOr
19020 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
19030 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
19040 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c  e->db, pOrderBy,
19050 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   0);..  /* Alloc
19060 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74  ate a range of t
19070 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
19080 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e  rs and the KeyIn
19090 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66  fo needed.  ** f
190a0 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  or the logic tha
190b0 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63  t removes duplic
190c0 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20  ate result rows 
190d0 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70  when the.  ** op
190e0 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c  erator is UNION,
190f0 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
19100 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55  RSECT (but not U
19110 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a  NION ALL)..  */.
19120 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
19130 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20   ){.    regPrev 
19140 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
19150 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d    int nExpr = p-
19160 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
19170 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64      assert( nOrd
19180 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64  erBy>=nExpr || d
19190 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
191a0 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  );.    regPrev =
191b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
191c0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
191d0 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20  m += nExpr+1;.  
191e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
191f0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
19200 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 0, regPrev);.
19210 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71      pKeyDup = sq
19220 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
19230 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b  c(db, nExpr, 1);
19240 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70  .    if( pKeyDup
19250 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19260 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
19270 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
19280 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f  Dup) );.      fo
19290 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
192a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
192b0 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
192c0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
192d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
192e0 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
192f0 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
19300 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
19310 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
19320 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
19330 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
19340 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
19350 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
19360 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
19370 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
19380 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  0;.  sqlite3Reso
19390 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
193a0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
193b0 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
193c0 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
193d0 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
193e0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
193f0 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
19400 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69  se, pPrior, pPri
19410 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f  or->pOrderBy, "O
19420 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  RDER");.  }..  /
19430 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  * Compute the li
19440 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f  mit registers */
19450 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
19460 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
19470 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   p, labelEnd);. 
19480 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26   if( p->iLimit &
19490 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  & op==TK_ALL ){.
194a0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
194b0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
194c0 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20      regLimitB = 
194d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
194e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
194f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
19500 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  , p->iOffset ? p
19510 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d  ->iOffset+1 : p-
19520 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  >iLimit,.       
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19540 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69             regLi
19550 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  mitA);.    sqlit
19560 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19570 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69  OP_Copy, regLimi
19580 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a  tA, regLimitB);.
19590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
195a0 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69  LimitA = regLimi
195b0 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  tB = 0;.  }.  sq
195c0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
195d0 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
195e0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
195f0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
19600 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
19610 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73  set);.  p->pOffs
19620 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64  et = 0;..  regAd
19630 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drA = ++pParse->
19640 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42  nMem;.  regAddrB
19650 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
19660 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
19670 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
19680 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
19690 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
196a0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
196b0 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
196c0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
196d0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
196e0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
196f0 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
19700 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
19710 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19720 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
19730 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
19740 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
19750 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74  e.  ** left of t
19760 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  he compound oper
19770 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73  ator - the "A" s
19780 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64  elect..  */.  ad
19790 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
197a0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
197b0 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20  dr(v) + 1;.  j1 
197c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
197d0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
197e0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
197f0 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
19800 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
19810 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
19820 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
19830 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
19840 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65  itA;.  explainSe
19850 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
19860 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
19870 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
19880 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
19890 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b  pPrior, &destA);
198a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
198b0 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
198c0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
198d0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
198e0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
198f0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19900 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
19910 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
19920 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
19930 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
19940 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
19950 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
19960 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
19970 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19980 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c   + 1;.  j1 = sql
19990 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
199a0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
199b0 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
199c0 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
199d0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
199e0 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
199f0 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
19a00 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
19a10 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
19a20 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
19a30 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
19a40 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
19a50 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
19a60 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
19a70 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
19a80 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
19a90 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
19aa0 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
19ab0 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
19ac0 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
19ad0 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
19ae0 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
19af0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
19b00 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19b10 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
19b20 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
19b30 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
19b40 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
19b50 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
19b60 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
19b70 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
19b80 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
19b90 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
19ba0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
19bb0 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
19bc0 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
19bd0 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
19be0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
19bf0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
19c00 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
19c10 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
19c20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19c30 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
19c40 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
19c50 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
19c60 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
19c70 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
19c80 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
19c90 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
19ca0 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
19cb0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
19cc0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
19cd0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
19ce0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
19cf0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
19d00 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
19d10 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
19d20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
19d30 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
19d40 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
19d50 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
19d60 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
19d70 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
19d80 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
19d90 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
19da0 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
19db0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
19dc0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
19dd0 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65  eyDup);..  /* Ge
19de0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19df0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
19e00 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
19e10 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
19e20 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
19e30 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
19e40 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
19e50 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
19e60 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
19e70 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
19e80 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
19e90 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61   = addrEofA = la
19ea0 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  belEnd;.  }else{
19eb0 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
19ec0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
19ed0 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
19ee0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
19ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19f00 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
19f10 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
19f20 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  );.    addrEofA_
19f30 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  noB = sqlite3Vdb
19f40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
19f50 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c  eld, regAddrB, l
19f60 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20  abelEnd);.      
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
19f90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19fa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19fb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
19fc0 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  , 0, addrEofA);.
19fd0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
19fe0 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
19ff0 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20  lectRow;.  }..  
1a000 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1a010 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1a020 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1a030 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
1a040 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1a050 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1a060 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
1a070 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1a080 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1a090 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
1a0a0 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
1a0b0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
1a0c0 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
1a0d0 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
1a0e0 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
1a0f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
1a100 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
1a110 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a120 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
1a130 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
1a140 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
1a150 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a160 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
1a170 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
1a180 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a190 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a1a0 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrA, labelEnd);
1a1b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a1c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a1d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a1e0 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
1a1f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1a200 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1a210 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1a220 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
1a230 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a240 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
1a250 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
1a260 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a270 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1a280 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1a290 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
1a2a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a2b0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1a2c0 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1a2d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1a2e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a2f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1a300 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1a310 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a320 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1a330 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
1a340 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1a350 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1a360 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
1a370 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
1a380 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1a390 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1a3a0 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
1a3b0 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
1a3c0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1a3d0 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
1a3e0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1a3f0 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
1a400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a410 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a420 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1a430 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1a440 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1a450 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a460 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
1a470 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
1a480 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1a490 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1a4a0 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
1a4b0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1a4c0 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
1a4d0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
1a4e0 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
1a4f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1a500 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
1a510 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
1a520 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
1a530 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a540 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1a550 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1a560 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1a570 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a580 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1a590 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1a5a0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1a5b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a5c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
1a5d0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
1a5e0 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
1a5f0 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
1a600 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
1a610 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
1a620 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
1a630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a640 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a650 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1a660 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76  fA_noB); VdbeCov
1a670 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1a680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a690 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a6a0 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1a6b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a6c0 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
1a6d0 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
1a6e0 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
1a6f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a700 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
1a710 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a720 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
1a730 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
1a740 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
1a750 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
1a760 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1a770 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
1a780 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74  are, destA.iSdst
1a790 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e  , destB.iSdst, n
1a7a0 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7c0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72    (char*)pKeyMer
1a7d0 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  ge, P4_KEYINFO);
1a7e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1a7f0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
1a800 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c  _PERMUTE);.  sql
1a810 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a820 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
1a830 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
1a840 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f  ddrAgtB); VdbeCo
1a850 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1a860 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69   Jump to the thi
1a870 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72  s point in order
1a880 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
1a890 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
1a8a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1a8b0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
1a8c0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  End);..  /* Set 
1a8d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
1a8e0 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  tput columns.  *
1a8f0 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
1a900 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
1a910 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
1a920 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b  pFirst = pPrior;
1a930 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72  .    while( pFir
1a940 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
1a950 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
1a960 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61  rior;.    genera
1a970 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
1a980 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
1a990 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  >pEList);.  }.. 
1a9a0 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74   /* Reassembly t
1a9b0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1a9c0 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
1a9d0 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65  l be freed corre
1a9e0 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  ctly.  ** by the
1a9f0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1aa00 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  n */.  if( p->pP
1aa10 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rior ){.    sqli
1aa20 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1aa30 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
1aa40 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20    }.  p->pPrior 
1aa50 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69  = pPrior;.  pPri
1aa60 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a  or->pNext = p;..
1aa70 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
1aa80 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
1aa90 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
1aaa0 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
1aab0 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
1aac0 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78  eries ****/.  ex
1aad0 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
1aae0 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
1aaf0 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a  ub1, iSub2, 0);.
1ab00 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
1ab10 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64  >nErr!=0;.}.#end
1ab20 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
1ab30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1ab40 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1ab50 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1ab60 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20  IEW)./* Forward 
1ab70 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
1ab80 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1ab90 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65  tExprList(sqlite
1aba0 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  3*, ExprList*, i
1abb0 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  nt, ExprList*);.
1abc0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1abd0 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a  tSelect(sqlite3*
1abe0 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
1abf0 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f   ExprList *);../
1ac00 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1ac10 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1ac20 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1ac30 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1ac40 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1ac50 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1ac60 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1ac70 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1ac80 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1ac90 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1aca0 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1acb0 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1acc0 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1acd0 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1ace0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1acf0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1ad00 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1ad10 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1ad20 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1ad30 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1ad40 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1ad50 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1ad60 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1ad70 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1ad80 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1ad90 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1ada0 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1adb0 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1adc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1add0 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
1ade0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1adf0 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1ae00 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1ae10 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1ae20 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1ae30 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1ae40 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1ae50 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1ae60 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1ae70 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74  bstExpr(.  sqlit
1ae80 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
1ae90 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
1aea0 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63  errors to this c
1aeb0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
1aec0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1aed0 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68     /* Expr in wh
1aee0 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ich substitution
1aef0 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74   occurs */.  int
1af00 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1af10 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1af20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
1af30 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1af40 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75  t    /* Substitu
1af50 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  te expressions *
1af60 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
1af70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1af80 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1af90 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
1afa0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
1afb0 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1afc0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1afd0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1afe0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1aff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1b000 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1b010 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
1b020 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
1b030 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
1b040 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
1b050 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1b060 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
1b070 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
1b080 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1b090 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
1b0a0 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
1b0b0 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  umn].pExpr, 0);.
1b0c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b0d0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
1b0e0 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20  r);.      pExpr 
1b0f0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
1b100 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72  }else{.    pExpr
1b110 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1b120 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
1b130 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
1b140 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72  List);.    pExpr
1b150 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
1b160 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
1b170 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
1b180 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
1b190 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1b1a0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1b1b0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
1b1c0 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
1b1d0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
1b1e0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b1f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b200 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1b210 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (db, pExpr->x.pL
1b220 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
1b230 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1b240 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1b250 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1b260 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73  bstExprList(.  s
1b270 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1b280 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1b290 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
1b2a0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1b2b0 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69  pList,     /* Li
1b2c0 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
1b2d0 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1b2e0 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20  substitutes */. 
1b2f0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1b300 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1b310 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
1b320 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1b330 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
1b340 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
1b350 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1b360 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1b370 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1b380 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1b390 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
1b3a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
1b3b0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b3c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1b3d0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b3e0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
1b3f0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1b400 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1b410 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
1b420 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1b430 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
1b440 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1b450 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1b460 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1b470 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1b480 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
1b490 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1b4a0 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
1b4b0 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
1b4c0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
1b4d0 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
1b4e0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  ues */.){.  SrcL
1b4f0 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1b500 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b510 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1b520 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1b530 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
1b540 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
1b550 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
1b560 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
1b570 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
1b580 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
1b590 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
1b5a0 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f  prList(db, p->pO
1b5b0 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
1b5c0 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48  pEList);.  p->pH
1b5d0 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1b5e0 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
1b5f0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b600 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  );.  p->pWhere =
1b610 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b620 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
1b630 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
1b640 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
1b650 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
1b660 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20  pEList);.  pSrc 
1b670 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
1b680 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a  ert( pSrc );  /*
1b690 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43   Even for (SELEC
1b6a0 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53  T 1) we have: pS
1b6b0 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e  rc!=0 but pSrc->
1b6c0 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28  nSrc==0 */.  if(
1b6d0 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b   ALWAYS(pSrc) ){
1b6e0 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
1b6f0 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
1b700 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
1b710 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1b720 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
1b730 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1b740 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b750 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1b760 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1b770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1b780 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1b790 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1b7a0 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1b7b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b7c0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1b7d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b7e0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1b7f0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1b800 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1b810 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1b820 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1b830 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1b840 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1b850 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1b860 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1b870 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1b880 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1b890 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1b8a0 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1b8b0 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1b8c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1b8d0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1b8e0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1b8f0 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1b900 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1b910 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1b920 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1b930 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1b940 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1b950 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1b960 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1b970 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1b980 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1b990 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1b9a0 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1b9b0 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1b9c0 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1b9d0 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1b9e0 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1b9f0 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1ba00 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1ba10 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1ba20 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1ba30 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1ba40 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1ba50 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1ba60 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1ba70 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1ba80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1ba90 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1baa0 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1bab0 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1bac0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1bad0 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1bae0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1baf0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1bb00 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1bb10 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1bb20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1bb30 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1bb40 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1bb50 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1bb60 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1bb70 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1bb80 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1bb90 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1bba0 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1bbb0 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1bbc0 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1bbd0 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1bbe0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1bbf0 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1bc00 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
1bc10 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
1bc20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1bc30 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
1bc40 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1bc50 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1bc60 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1bc70 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
1bc80 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
1bc90 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1bca0 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 28  n aggregate or (
1bcb0 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1bcc0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
1bcd0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20  n.**        and 
1bce0 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20 71  (2b) the outer q
1bcf0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1bd00 65 20 73 75 62 71 75 65 72 69 65 73 20 6f 74 68  e subqueries oth
1bd10 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a  er than the one.
1bd20 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d 2d 63  **        FROM-c
1bd30 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 74  lause subquery t
1bd40 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61  hat is a candida
1bd50 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e  te for flattenin
1bd60 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20 20 20  g.  (2b is.**   
1bd70 20 20 20 20 20 64 75 65 20 74 6f 20 74 69 63 6b       due to tick
1bd80 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39  et [2f7170d73bf9
1bd90 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30 31 35  abf80] from 2015
1bda0 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1bdb0 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
1bdc0 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
1bdd0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1bde0 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
1bdf0 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67  .**        (Orig
1be00 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33  inally ticket #3
1be10 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65  06.  Strengthene
1be20 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30  d by ticket #330
1be30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  0).**.**   (4)  
1be40 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1be50 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a  not DISTINCT..**
1be60 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
1be70 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
1be80 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
1be90 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
1bea0 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
1beb0 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
1bec0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
1bed0 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
1bee0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
1bef0 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
1bf00 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
1bf10 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
1bf20 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
1bf30 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
1bf40 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ries..**.**   (6
1bf50 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1bf60 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
1bf70 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
1bf80 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1bf90 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
1bfa0 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
1bfb0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1bfc0 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
1bfd0 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73  e.  TODO:  For s
1bfe0 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  ubqueries withou
1bff0 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52  t.**        A FR
1c000 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69  OM clause, consi
1c010 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f  der adding a FRO
1c020 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65  M close with the
1c030 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20   special.**     
1c040 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f     table sqlite_
1c050 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73  once that consis
1c060 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72  ts of a single r
1c070 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  ow containing a.
1c080 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65  **        single
1c090 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   NULL..**.**   (
1c0a0 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
1c0b0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1c0c0 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1c0d0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
1c0e0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
1c0f0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c100 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1c110 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1c120 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c130 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
1c140 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
1c150 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f  (**)  Restrictio
1c160 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76  n (10) was remov
1c170 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65  ed from the code
1c180 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62   on 2005-02-05 b
1c190 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1c1a0 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69  accidently carri
1c1b0 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66  ed the comment f
1c1c0 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31  orward until 201
1c1d0 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e  4-09-15.  Origin
1c1e0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 65 78  al.**        tex
1c1f0 74 3a 20 22 54 68 65 20 73 75 62 71 75 65 72 79  t: "The subquery
1c200 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1c210 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1c220 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20  outer query .** 
1c230 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20         does not 
1c240 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a  use LIMIT.".**.*
1c250 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
1c260 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1c270 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1c280 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
1c290 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
1c2a0 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d  **  (**)  Not im
1c2b0 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
1c2c0 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
1c2d0 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
1c2e0 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
1c2f0 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
1c300 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
1c310 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
1c320 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
1c330 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1c340 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
1c350 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
1c360 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
1c370 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
1c380 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
1c390 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  FFSET..**.**  (1
1c3a0 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
1c3b0 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
1c3c0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1c3d0 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
1c3e0 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
1c3f0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
1c400 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  IMIT clause..** 
1c410 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
1c420 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63  et #2339 and tic
1c430 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d  ket [02a8e81d44]
1c440 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20  )..**.**  (16)  
1c450 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1c460 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1c470 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75  ate or the subqu
1c480 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20  ery does.**     
1c490 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f     not contain O
1c4a0 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
1c4b0 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
1c4c0 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
1c4d0 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
1c4e0 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
1c4f0 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
1c500 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
1c510 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20  *.**  (17)  The 
1c520 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
1c530 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1c540 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55  ct, or it is a U
1c550 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20  NION ALL .**    
1c560 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61      compound cla
1c570 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69  use made up enti
1c580 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72  rely of non-aggr
1c590 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61  egate queries, a
1c5a0 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  nd .**        th
1c5b0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a  e parent query:.
1c5c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  **.**          *
1c5d0 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70   is not itself p
1c5e0 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
1c5f0 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20  d select,.**    
1c600 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
1c610 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44  n aggregate or D
1c620 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61  ISTINCT query, a
1c630 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  nd.**          *
1c640 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a   is not a join.*
1c650 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
1c660 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
1c670 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
1c680 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
1c690 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
1c6a0 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
1c6b0 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
1c6c0 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
1c6d0 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
1c6e0 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
1c6f0 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
1c700 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72  es.  The subquer
1c710 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79  y cannot use any
1c720 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1c730 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68      operator oth
1c740 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
1c750 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  L because all th
1c760 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64  e other compound
1c770 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
1c780 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70  tors have an imp
1c790 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68  lied DISTINCT wh
1c7a0 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ich is disallowe
1c7b0 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  d by.**        r
1c7c0 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a  estriction (4)..
1c7d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73  **.**        Als
1c7e0 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  o, each componen
1c7f0 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  t of the sub-que
1c800 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74  ry must return t
1c810 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
1c820 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75  *        of resu
1c830 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73  lt columns. This
1c840 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72   is actually a r
1c850 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61  equirement for a
1c860 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1c870 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61        SELECT sta
1c880 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20  tement, but all 
1c890 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f  the code here do
1c8a0 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20  es is make sure 
1c8b0 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20  that no.**      
1c8c0 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29    such (illegal)
1c8d0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c   sub-query is fl
1c8e0 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c  attened. The cal
1c8f0 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20  ler will detect 
1c900 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79  the.**        sy
1c910 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72  ntax error and r
1c920 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64  eturn a detailed
1c930 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
1c940 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
1c950 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1c960 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1c970 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
1c980 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
1c990 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66  DER by clause of
1c9a0 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
1c9b0 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
1c9c0 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
1c9d0 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
1c9e0 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
1c9f0 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73  .**  (19)  The s
1ca00 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1ca10 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1ca20 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1ca30 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
1ca40 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
1ca50 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30  ause..**.**  (20
1ca60 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1ca70 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1ca80 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69  d select, then i
1ca90 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a  t must not use.*
1caa0 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45  *        an ORDE
1cab0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69  R BY clause.  Ti
1cac0 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20  cket #3773.  We 
1cad0 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73  could relax this
1cae0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
1caf0 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62        somewhat b
1cb00 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68  y saying that th
1cb10 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  e terms of the O
1cb20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d  RDER BY clause m
1cb30 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70  ust.**        ap
1cb40 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69  pear as unmodifi
1cb50 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ed result column
1cb60 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
1cb70 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a  uery.  But we.**
1cb80 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68          have oth
1cb90 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1cba0 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c   in mind to deal
1cbb0 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e   with that case.
1cbc0 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68  .**.**  (21)  Th
1cbd0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1cbe0 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1cbf0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cc00 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
1cc10 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
1cc20 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
1cc30 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  46fc])..**.**  (
1cc40 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  22)  The subquer
1cc50 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  y is not a recur
1cc60 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  sive CTE..**.** 
1cc70 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65 6e   (23)  The paren
1cc80 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  t is not a recur
1cc90 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65  sive CTE, or the
1cca0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
1ccb0 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  t a.**        co
1ccc0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68  mpound query. Th
1ccd0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69  is restriction i
1cce0 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66  s because transf
1ccf0 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  orming the.**   
1cd00 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61       parent to a
1cd10 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1cd20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64  confuses the cod
1cd30 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a  e that handles.*
1cd40 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69  *        recursi
1cd50 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75  ve queries in mu
1cd60 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a  ltiSelect()..**.
1cd70 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20 73 75  **  (24)  The su
1cd80 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
1cd90 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74 20   aggregate that 
1cda0 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69  uses the built-i
1cdb0 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20  n min() or .**  
1cdc0 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66        or max() f
1cdd0 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68  unctions.  (With
1cde0 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  out this restric
1cdf0 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69  tion, a query li
1ce00 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53  ke:.**        "S
1ce10 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
1ce20 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46  LECT max(y), x F
1ce30 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e  ROM t1)" would n
1ce40 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a  ot necessarily.*
1ce50 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  *        return 
1ce60 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20  the value X for 
1ce70 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78 69  which Y was maxi
1ce80 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49  mal.).**.**.** I
1ce90 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
1cea0 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
1ceb0 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
1cec0 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
1ced0 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
1cee0 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
1cef0 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
1cf00 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
1cf10 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
1cf20 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
1cf30 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
1cf40 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
1cf50 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1cf60 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
1cf70 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1cf80 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
1cf90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1cfa0 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
1cfb0 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
1cfc0 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
1cfd0 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
1cfe0 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
1cff0 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
1d000 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
1d010 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
1d020 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
1d030 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
1d040 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
1d050 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
1d060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d070 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
1d080 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d090 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
1d0a0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d0b0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1d0c0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
1d0d0 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
1d0e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
1d0f0 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
1d100 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d110 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
1d120 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
1d130 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
1d140 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
1d150 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
1d160 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
1d170 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1d180 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
1d190 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
1d1a0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1d1b0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1d1c0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
1d1d0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1d1e0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1d1f0 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
1d200 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
1d210 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53  ct *pParent;.  S
1d220 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
1d230 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
1d240 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
1d250 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
1d260 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
1d270 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
1d280 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
1d290 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
1d2a0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1d2b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
1d2c0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1d2d0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
1d2e0 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
1d2f0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1d300 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1d310 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
1d320 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
1d330 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
1d340 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
1d350 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
1d360 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
1d370 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
1d380 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
1d390 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
1d3a0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1d3b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1d3c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1d3d0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
1d3e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d3f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1d400 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
1d410 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d420 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
1d430 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
1d440 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1d450 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
1d460 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1d470 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
1d480 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
1d490 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
1d4a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1d4b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1d4c0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
1d4d0 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66    /* Unable to f
1d4e0 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20  latten compound 
1d4f0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28  queries */.  if(
1d500 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
1d510 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
1d520 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
1d530 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1d540 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1d550 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
1d560 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
1d570 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
1d580 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
1d590 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
1d5a0 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
1d5b0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1d5c0 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
1d5d0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
1d5e0 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
1d5f0 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1d600 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  gg ){.    if( is
1d610 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d640 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1d650 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  )   */.    if( p
1d660 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
1d670 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d6a0 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  2a)  */.    if( 
1d6b0 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20 45 78  (p->pWhere && Ex
1d6c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d  prHasProperty(p-
1d6d0 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62 71 75  >pWhere,EP_Subqu
1d6e0 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20 28 73  ery)).     || (s
1d6f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
1d700 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29 20 26  ags(p->pEList) &
1d710 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30   EP_Subquery)!=0
1d720 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  .     || (sqlite
1d730 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
1d740 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20 45 50  ->pOrderBy) & EP
1d750 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20  _Subquery)!=0.  
1d760 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1d770 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d7a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 62   Restriction (2b
1d7b0 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  )  */.    }.  }.
1d7c0 20 20 20 20 0a 20 20 70 53 75 62 53 72 63 20 3d      .  pSubSrc =
1d7d0 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
1d7e0 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
1d7f0 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
1d800 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
1d810 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
1d820 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
1d830 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
1d840 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
1d850 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
1d860 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
1d870 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
1d880 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1d890 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
1d8a0 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
1d8b0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1d8c0 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
1d8d0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1d8e0 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
1d8f0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
1d900 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
1d910 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
1d920 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
1d930 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
1d940 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1d950 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
1d960 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d970 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d980 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
1d990 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20  ( pSub->pOffset 
1d9a0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d9d0 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
1d9e0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1d9f0 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30   SF_Compound)!=0
1da00 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
1da10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1da20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da50 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
1da60 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
1da70 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
1da80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1dab0 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (7)  */.  if( pS
1dac0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1dad0 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  F_Distinct ) ret
1dae0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1daf0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1db00 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (5)  */.  if( pS
1db10 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1db20 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
1db30 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
1db40 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1db50 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
1db60 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20  (8)(9) */.  }.  
1db70 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1db80 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1db90 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73  =0 && subqueryIs
1dba0 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75  Agg ){.     retu
1dbb0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1dbc0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
1dbd0 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70    */.  }.  if( p
1dbe0 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
1dbf0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1dc00 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dc40 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
1dc50 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
1dc60 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1dc70 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc90 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
1dca0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1dcb0 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
1dcc0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dce0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
1dcf0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1dd00 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65  pLimit && (p->se
1dd10 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1dd20 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  inct)!=0 ){.    
1dd30 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1dd40 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dd50 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (21) */.  }.  
1dd60 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e  testcase( pSub->
1dd70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1dd80 63 75 72 73 69 76 65 20 29 3b 0a 20 20 74 65 73  cursive );.  tes
1dd90 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c  tcase( pSub->sel
1dda0 46 6c 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d 61  Flags & SF_MinMa
1ddb0 78 41 67 67 20 29 3b 0a 20 20 69 66 28 20 70 53  xAgg );.  if( pS
1ddc0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  ub->selFlags & (
1ddd0 53 46 5f 52 65 63 75 72 73 69 76 65 7c 53 46 5f  SF_Recursive|SF_
1dde0 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20 20  MinMaxAgg) ){.  
1ddf0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1de00 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29  estrictions (22)
1de10 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20 7d   and (24) */.  }
1de20 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1de30 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
1de40 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72  ve) && pSub->pPr
1de50 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
1de60 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
1de70 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d 0a  ion (23) */.  }.
1de80 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  /* OBSOLETE C
1de90 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52  OMMENT 1:.  ** R
1dea0 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
1deb0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1dec0 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
1ded0 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
1dee0 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
1def0 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
1df00 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
1df10 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
1df20 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
1df30 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
1df40 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
1df50 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
1df60 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
1df70 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
1df80 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1df90 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1dfa0 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1dfb0 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1dfc0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1dfd0 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
1dfe0 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
1dff0 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
1e000 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
1e010 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1e020 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 2:.  ** Restri
1e030 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
1e040 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1e050 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1e060 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
1e070 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
1e080 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1e090 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
1e0a0 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
1e0b0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1e0c0 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
1e0d0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1e0e0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1e0f0 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
1e100 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
1e110 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
1e120 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1e130 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1e140 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1e150 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1e160 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1e170 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
1e180 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
1e190 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
1e1a0 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
1e1b0 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
1e1c0 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
1e1d0 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
1e1e0 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
1e1f0 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
1e200 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   JOIN..  **.  **
1e210 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20   THIS OVERRIDES 
1e220 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
1e230 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a  S 1 AND 2 ABOVE:
1e240 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33  .  ** Ticket #33
1e250 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c  00 shows that fl
1e260 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67  attening the rig
1e270 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
1e280 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66  T JOIN.  ** is f
1e290 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67  raught with dang
1e2a0 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f  er.  Best to avo
1e2b0 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  id the whole thi
1e2c0 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ng.  If the.  **
1e2d0 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1e2e0 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
1e2f0 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
1e300 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
1e310 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
1e320 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
1e330 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
1e340 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1e350 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
1e360 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65  ction 17: If the
1e370 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1e380 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
1e390 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20   then it must.  
1e3a0 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  ** use only the 
1e3b0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1e3c0 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20  or. And none of 
1e3d0 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63  the simple selec
1e3e0 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  t queries.  ** t
1e3f0 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
1e400 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1e410 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  are allowed to b
1e420 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64  e aggregate or d
1e430 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65  istinct.  ** que
1e440 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ries..  */.  if(
1e450 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b   pSub->pPrior ){
1e460 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1e470 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1e480 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52   return 0;  /* R
1e490 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f  estriction 20 */
1e4a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1e4b0 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  sAgg || (p->selF
1e4c0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1e4d0 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e  ct)!=0 || pSrc->
1e4e0 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
1e4f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1e500 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
1e510 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
1e520 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
1e530 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e540 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1e550 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1e560 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1e570 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
1e580 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e590 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1e5a0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1e5b0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1e5c0 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
1e5d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e5e0 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  Sub->pSrc!=0 );.
1e5f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1e600 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
1e610 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74  r==pSub1->pEList
1e620 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1e630 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c   if( (pSub1->sel
1e640 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1e650 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1e660 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e))!=0.       ||
1e670 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
1e680 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
1e690 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c  _ALL) .       ||
1e6a0 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
1e6b0 72 63 3c 31 0a 20 20 20 20 20 20 29 7b 0a 20 20  rc<1.      ){.  
1e6c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1e6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
1e6e0 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
1e6f0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
1e700 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
1e710 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a  triction 18. */.
1e720 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1e730 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
1e740 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
1e750 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
1e760 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
1e770 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e780 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
1e790 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
1e7a0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
1e7b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e7c0 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
1e7d0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1e7e0 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
1e7f0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
1e800 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41  ***/.  SELECTTRA
1e810 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
1e820 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72  flatten %s.%p fr
1e830 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20  om term %d\n",. 
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65    pSub->zSelName
1e860 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b  , pSub, iFrom));
1e870 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1e880 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1e890 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1e8a0 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1e8b0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1e8c0 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1e8d0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1e8e0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1e8f0 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1e900 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1e910 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1e920 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1e930 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1e940 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1e950 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1e960 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1e970 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1e980 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1e990 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1e9a0 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1e9b0 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1e9c0 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1e9d0 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1e9e0 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1e9f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1ea00 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1ea10 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1ea20 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1ea30 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1ea40 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1ea50 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1ea60 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1ea70 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1ea80 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1ea90 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1eaa0 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1eab0 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1eac0 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1ead0 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1eae0 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1eaf0 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1eb00 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1eb10 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1eb20 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1eb30 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1eb40 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1eb50 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1eb60 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1eb70 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1eb80 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1eb90 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1eba0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1ebb0 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1ebc0 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1ebd0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1ebe0 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1ebf0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1ec00 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1ec10 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1ec20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1ec30 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1ec40 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1ec50 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1ec60 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1ec70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1ec80 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1ec90 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1eca0 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1ecb0 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1ecc0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1ecd0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1ece0 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1ecf0 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1ed00 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1ed10 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1ed20 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1ed30 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1ed40 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1ed50 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1ed60 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1ed70 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1ed80 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1ed90 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1eda0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1edb0 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1edc0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1edd0 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1ede0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1edf0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1ee00 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1ee10 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1ee20 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1ee30 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1ee40 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1ee50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1ee60 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1ee70 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1ee80 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1ee90 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1eea0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1eeb0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1eec0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1eed0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1eee0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , p, 0);.    sql
1eef0 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
1ef00 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53  e(pNew, pSub->zS
1ef10 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  elName);.    p->
1ef20 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1ef30 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1ef40 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1ef50 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1ef60 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1ef70 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1ef80 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1ef90 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1efa0 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  {.      p->pPrio
1efb0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1efc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
1efd0 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
1efe0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  or;.      if( pP
1eff0 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
1f000 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
1f010 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
1f020 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   p;.      p->pPr
1f030 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1f040 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c    SELECTTRACE(2,
1f050 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20  pParse,p,.      
1f060 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75     ("compound-su
1f070 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72  bquery flattener
1f080 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20 61   creates %s.%p a
1f090 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20  s peer\n",.     
1f0a0 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61      pNew->zSelNa
1f0b0 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20  me, pNew));.    
1f0c0 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1f0d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1f0e0 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
1f0f0 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
1f100 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
1f110 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1f120 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
1f130 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f140 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
1f150 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
1f160 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
1f170 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
1f180 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1f190 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1f1a0 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1f1b0 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1f1c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f1d0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1f1e0 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1f1f0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1f200 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1f210 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f220 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1f230 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1f240 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1f250 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1f260 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1f270 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1f280 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1f290 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1f2a0 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1f2b0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1f2c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1f2d0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1f2e0 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1f2f0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1f300 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1f310 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1f320 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1f330 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1f340 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1f350 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1f360 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1f370 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1f380 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1f390 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1f3a0 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1f3b0 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1f3c0 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1f3d0 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1f3e0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1f3f0 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1f400 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1f410 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1f420 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1f430 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1f440 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1f450 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1f460 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1f470 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1f480 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1f490 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1f4a0 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1f4b0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1f4c0 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1f4d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f4e0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1f4f0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1f500 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1f510 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1f520 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1f530 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1f540 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1f550 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1f560 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1f570 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1f580 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1f590 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1f5a0 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1f5b0 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1f5c0 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1f5d0 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1f5e0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1f5f0 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1f600 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1f610 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1f620 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1f630 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1f640 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1f650 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1f660 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1f670 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1f680 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1f690 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1f6a0 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1f6b0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1f6c0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1f6d0 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1f6e0 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1f6f0 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1f700 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1f710 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1f720 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1f730 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1f740 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1f750 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1f760 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1f770 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1f780 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1f790 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1f7a0 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1f7b0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1f7c0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1f7d0 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1f7e0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1f7f0 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1f800 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1f810 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1f820 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1f830 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1f840 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1f850 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1f860 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1f870 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1f880 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1f890 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1f8a0 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1f8b0 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1f8c0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1f8d0 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1f8e0 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1f8f0 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1f900 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1f910 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1f920 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1f930 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1f940 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1f950 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1f960 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1f970 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1f980 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1f990 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1f9a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1f9b0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1f9c0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1f9d0 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1f9e0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1f9f0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1fa00 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1fa10 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1fa20 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1fa30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1fa40 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1fa50 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1fa60 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1fa70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fa80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1fa90 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1faa0 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1fab0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1fac0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1fad0 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1fae0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1faf0 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1fb00 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1fb10 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1fb20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1fb30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fb40 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1fb50 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1fb60 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1fb70 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1fb80 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1fb90 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1fba0 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1fbb0 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1fbc0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1fbd0 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1fbe0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1fbf0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1fc00 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1fc10 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1fc20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1fc30 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1fc40 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1fc50 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1fc60 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1fc70 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1fc80 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1fc90 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1fca0 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1fcb0 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1fcc0 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1fcd0 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1fce0 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1fcf0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1fd00 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1fd10 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1fd20 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1fd30 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1fd40 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1fd50 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1fd60 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1fd70 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1fd80 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1fd90 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1fda0 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1fdb0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1fdc0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1fdd0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1fde0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1fdf0 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1fe00 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1fe10 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1fe20 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1fe30 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1fe40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1fe50 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1fe60 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1fe70 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1fe80 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1fe90 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1fea0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1feb0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1fec0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1fed0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1fee0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1fef0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1ff00 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1ff10 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1ff20 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1ff30 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1ff40 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1ff50 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1ff60 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1ff70 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1ff80 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1ff90 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1ffa0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1ffb0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1ffc0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1ffd0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1ffe0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1fff0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
20000 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
20010 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
20020 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
20030 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
20040 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
20050 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
20060 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
20070 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
20080 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
20090 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
200a0 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
200b0 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
200c0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
200d0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
200e0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
200f0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
20100 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
20110 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
20120 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
20130 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
20140 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
20150 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
20160 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
20170 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20180 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
20190 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
201a0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
201b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
201c0 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
201d0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
201e0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
201f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20200 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
20210 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
20220 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
20230 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
20240 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
20250 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
20260 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
20270 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
20280 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
20290 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
202a0 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
202b0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
202c0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
202d0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
202e0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
202f0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
20300 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
20310 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
20320 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
20330 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
20340 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
20350 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
20360 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
20370 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
20380 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20390 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
203a0 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
203b0 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
203c0 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
203d0 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
203e0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
203f0 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
20400 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
20410 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
20420 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
20430 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
20440 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
20450 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
20460 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
20470 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
20480 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
20490 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
204a0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
204b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
204c0 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
204d0 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
204e0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
204f0 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
20500 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
20510 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
20520 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
20530 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
20540 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
20550 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
20560 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
20570 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
20580 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
20590 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
205a0 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
205b0 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
205c0 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
205d0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
205e0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
205f0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
20600 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
20610 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
20620 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
20630 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
20640 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
20650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
20660 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
20670 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
20680 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
20690 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
206a0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
206b0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
206c0 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
206d0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
206e0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
206f0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
20700 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
20710 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
20720 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
20730 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
20740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20750 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
20760 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
20770 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
20780 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
20790 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
207a0 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
207b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
207c0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
207d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
207e0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
207f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
20800 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
20810 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
20820 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20830 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
20840 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20850 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
20860 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
20870 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
20880 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
20890 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
208a0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
208b0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
208c0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
208d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
20900 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
20910 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
20920 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
20930 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
20940 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
20950 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
20960 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
20970 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
20980 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
20990 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
209a0 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
209b0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
209c0 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
209d0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
209e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
209f0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
20a00 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
20a10 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
20a20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
20a30 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
20a40 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
20a50 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
20a60 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
20a70 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
20a80 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
20a90 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
20aa0 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
20ab0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
20ac0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
20ad0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
20ae0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
20af0 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
20b00 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
20b10 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
20b20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
20b30 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
20b40 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
20b50 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
20b60 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
20b70 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
20b80 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
20b90 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
20ba0 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
20bb0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
20bc0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
20bd0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
20be0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
20bf0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
20c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20c10 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
20c20 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
20c30 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
20c40 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
20c50 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
20c60 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
20c70 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
20c80 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
20c90 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
20ca0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
20cb0 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
20cc0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
20cd0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
20ce0 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e  er flattening:\n
20cf0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
20d00 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
20d10 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
20d20 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b  dif..  return 1;
20d30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
20d40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
20d50 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
20d60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20d70 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a  MIT_VIEW) */....
20d80 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
20d90 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
20da0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
20db0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
20dc0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69  ./*.** Make copi
20dd0 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57  es of relevant W
20de0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
20df0 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  s of the outer q
20e00 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65  uery into.** the
20e10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
20e20 20 73 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d   subquery.  Exam
20e30 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ple:.**.**    SE
20e40 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
20e50 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20  ECT a AS x, c-d 
20e60 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48  AS y FROM t1) WH
20e70 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30  ERE x=5 AND y=10
20e80 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72  ;.**.** Transfor
20e90 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20  med into:.**.** 
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 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20  1 WHERE a=5 AND 
20ee0 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57  c-d=10).**     W
20ef0 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31  HERE x=5 AND y=1
20f00 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70  0;.**.** The hop
20f10 65 20 69 73 20 74 68 61 74 20 74 68 65 20 74 65  e is that the te
20f20 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  rms added to the
20f30 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c   inner query wil
20f40 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a  l make it more.*
20f50 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  * efficient..**.
20f60 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
20f70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
20f80 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ion if:.**.**   
20f90 28 31 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (1) The inner qu
20fa0 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67  ery is an aggreg
20fb0 61 74 65 2e 20 20 28 49 6e 20 74 68 61 74 20 63  ate.  (In that c
20fc0 61 73 65 2c 20 77 65 27 64 20 72 65 61 6c 6c 79  ase, we'd really
20fd0 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20 20 20 74   want.**       t
20fe0 6f 20 63 6f 70 79 20 74 68 65 20 6f 75 74 65 72  o copy the outer
20ff0 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65   WHERE-clause te
21000 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 48 41 56  rms onto the HAV
21010 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
21020 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 6e 65 72  e.**       inner
21030 20 71 75 65 72 79 2e 20 20 42 75 74 20 74 68 65   query.  But the
21040 79 20 70 72 6f 62 61 62 6c 79 20 77 6f 6e 27 74  y probably won't
21050 20 68 65 6c 70 20 74 68 65 72 65 20 73 6f 20 64   help there so d
21060 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e 29 0a 2a  o not bother.).*
21070 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69  *.**   (2) The i
21080 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68  nner query is th
21090 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74  e recursive part
210a0 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62   of a common tab
210b0 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  le expression..*
210c0 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69  *.**   (3) The i
210d0 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61  nner query has a
210e0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73   LIMIT clause (s
210f0 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73  ince the changes
21100 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a   to the WHERE.**
21110 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75         close wou
21120 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65  ld change the me
21130 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d  aning of the LIM
21140 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  IT)..**.**   (4)
21150 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
21160 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
21170 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
21180 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c  JOIN.  (The call
21190 65 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f  er.**       enfo
211a0 72 63 65 73 20 74 68 69 73 20 72 65 73 74 72 69  rces this restri
211b0 63 74 69 6f 6e 20 73 69 6e 63 65 20 74 68 69 73  ction since this
211c0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
211d0 74 20 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a  t have enough.**
211e0 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69         informati
211f0 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a  on to know.).**.
21200 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  ** Return 0 if n
21210 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
21220 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  de and non-zero 
21230 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  if one or more W
21240 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74  HERE clause.** t
21250 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61  erms are duplica
21260 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ted into the sub
21270 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
21280 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65   int pushDownWhe
21290 72 65 54 65 72 6d 73 28 0a 20 20 73 71 6c 69 74  reTerms(.  sqlit
212a0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
212b0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
212c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72   connection (for
212d0 20 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20 20   malloc()) */.  
212e0 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20  Select *pSubq,  
212f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62        /* The sub
21300 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52  query whose WHER
21310 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62  E clause is to b
21320 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20  e augmented */. 
21330 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
21340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
21350 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
21360 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
21370 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20  .  int iCursor  
21380 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21390 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
213a0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a   subquery */.){.
213b0 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
213c0 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20  int nChng = 0;. 
213d0 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29   if( pWhere==0 )
213e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
213f0 20 28 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67   (pSubq->selFlag
21400 73 20 26 20 28 53 46 5f 41 67 67 72 65 67 61 74  s & (SF_Aggregat
21410 65 7c 53 46 5f 52 65 63 75 72 73 69 76 65 29 29  e|SF_Recursive))
21420 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
21430 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
21440 74 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28 32  tions (1) and (2
21450 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
21460 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  Subq->pLimit!=0 
21470 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
21480 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
21490 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68   (3) */.  }.  wh
214a0 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
214b0 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e  =TK_AND ){.    n
214c0 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e  Chng += pushDown
214d0 57 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70  WhereTerms(db, p
214e0 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52  Subq, pWhere->pR
214f0 69 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a  ight, iCursor);.
21500 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68      pWhere = pWh
21510 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a  ere->pLeft;.  }.
21520 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
21530 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
21540 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72  (pWhere, iCursor
21550 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b  ) ){.    nChng++
21560 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75  ;.    while( pSu
21570 62 71 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  bq ){.      pNew
21580 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
21590 70 28 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29  p(db, pWhere, 0)
215a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
215b0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4e 65  ubstExpr(db, pNe
215c0 77 2c 20 69 43 75 72 73 6f 72 2c 20 70 53 75 62  w, iCursor, pSub
215d0 71 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  q->pEList);.    
215e0 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20    pSubq->pWhere 
215f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
21600 28 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65  (db, pSubq->pWhe
21610 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  re, pNew);.     
21620 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e   pSubq = pSubq->
21630 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  pPrior;.    }.  
21640 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67  }.  return nChng
21650 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
21660 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21670 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
21680 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21690 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f  OMIT_VIEW) */../
216a0 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68  *.** Based on th
216b0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
216c0 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
216d0 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
216e0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
216f0 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e  gument, this fun
21700 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
21710 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
21720 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
21730 20 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e   * the query con
21740 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e  tains just a sin
21750 67 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75  gle aggregate fu
21760 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20  nction,.**    * 
21770 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
21780 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72  nction is either
21790 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c   min() or max(),
217a0 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65   and.**    * the
217b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
217c0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
217d0 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
217e0 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  value..**.** If 
217f0 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
21800 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20   are true, then 
21810 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
21820 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
21830 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74  BY_MAX.** is ret
21840 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72  urned as appropr
21850 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d  iate. Also, *ppM
21860 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  inMax is set to 
21870 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a  point to the .**
21880 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e   list of argumen
21890 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
218a0 20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f 72   aggregate befor
218b0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
218c0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f  ** Or, if the co
218d0 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61  nditions above a
218e0 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d  re not met, *ppM
218f0 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  inMax is set to 
21900 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f  0 and.** WHERE_O
21910 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73  RDERBY_NORMAL is
21920 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
21930 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75  atic u8 minMaxQu
21940 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67  ery(AggInfo *pAg
21950 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20  gInfo, ExprList 
21960 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69  **ppMinMax){.  i
21970 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f  nt eRet = WHERE_
21980 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20  ORDERBY_NORMAL; 
21990 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
219a0 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a  rn value */..  *
219b0 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20  ppMinMax = 0;.  
219c0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
219d0 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78  unc==1 ){.    Ex
219e0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67  pr *pExpr = pAgg
219f0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
21a00 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61  Expr; /* Aggrega
21a10 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  te function */. 
21a20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
21a30 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
21a40 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72  List;      /* Ar
21a50 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66  guments to agg f
21a60 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  unction */..    
21a70 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
21a80 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
21a90 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  ON );.    if( pE
21aa0 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
21ab0 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69  nExpr==1 && pELi
21ac0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
21ad0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
21ae0 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  N ){.      const
21af0 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70   char *zFunc = p
21b00 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
21b10 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21b20 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
21b30 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "min")==0 ){.   
21b40 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52       eRet = WHER
21b50 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
21b60 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78         *ppMinMax
21b70 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20   = pEList;.     
21b80 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
21b90 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
21ba0 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20   "max")==0 ){.  
21bb0 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45        eRet = WHE
21bc0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
21bd0 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61          *ppMinMa
21be0 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  x = pEList;.    
21bf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
21c00 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d   assert( *ppMinM
21c10 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e  ax==0 || (*ppMin
21c20 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  Max)->nExpr==1 )
21c30 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b  ;.  return eRet;
21c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
21c50 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
21c60 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
21c70 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
21c80 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
21c90 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
21ca0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
21cb0 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
21cc0 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
21cd0 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
21ce0 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
21cf0 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
21d00 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
21d10 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
21d20 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
21d30 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
21d40 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
21d50 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
21d60 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
21d70 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
21d80 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
21d90 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
21da0 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
21db0 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
21dc0 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
21dd0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
21de0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
21df0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
21e00 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
21e10 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
21e20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
21e30 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
21e40 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
21e50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
21e60 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
21e70 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
21e80 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
21e90 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
21ea0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
21eb0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
21ec0 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
21ed0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
21ee0 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
21ef0 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
21f00 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
21f10 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
21f20 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
21f30 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
21f40 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
21f50 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
21f60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
21f70 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
21f80 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
21f90 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
21fa0 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  VER(pAggInfo->nF
21fb0 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  unc==0) ) return
21fc0 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
21fd0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
21fe0 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53  unc->funcFlags&S
21ff0 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
22000 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
22010 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
22020 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20  ags&EP_Distinct 
22030 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
22040 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
22050 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72  *.** If the sour
22060 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73  ce-list item pas
22070 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
22080 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64  nt was augmented
22090 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45   with an.** INDE
220a0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
220b0 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74  hen try to locat
220c0 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
220d0 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a  index. If there.
220e0 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c  ** was such a cl
220f0 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d  ause and the nam
22100 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  ed index cannot 
22110 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
22120 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
22130 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  R and leave an e
22140 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20  rror in pParse. 
22150 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c  Otherwise, popul
22160 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70  ate .** pFrom->p
22170 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e  Index and return
22180 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
22190 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  nt sqlite3Indexe
221a0 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20  dByLookup(Parse 
221b0 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
221c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
221d0 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
221e0 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d  m->pTab && pFrom
221f0 2d 3e 7a 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  ->zIndexedBy ){.
22200 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
22210 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
22220 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65     char *zIndexe
22230 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dBy = pFrom->zIn
22240 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
22250 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
22260 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
22270 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
22280 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
22290 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
222a0 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
222b0 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
222c0 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
222d0 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
222e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
222f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22300 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
22310 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
22320 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
22330 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
22340 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
22350 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
22360 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
22370 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
22380 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
22390 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
223a0 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
223b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
223c0 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
223d0 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
223e0 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
223f0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
22400 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
22410 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
22420 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
22430 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
22440 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
22450 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
22460 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
22470 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
22480 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
22490 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
224a0 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
224b0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
224c0 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
224d0 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
224e0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
224f0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
22500 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
22510 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
22520 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
22530 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
22540 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
22550 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
22560 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
22570 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
22580 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
22590 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
225a0 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
225b0 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
225c0 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
225d0 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
225e0 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
225f0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
22600 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
22610 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
22620 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
22630 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
22640 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
22650 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
22660 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
22670 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
22680 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
22690 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
226a0 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
226b0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
226c0 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
226d0 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
226e0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
226f0 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
22700 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
22710 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
22720 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
22730 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
22740 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
22750 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
22760 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
22770 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
22780 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
22790 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
227a0 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
227b0 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
227c0 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
227d0 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
227e0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
227f0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
22800 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
22810 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
22820 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
22830 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
22840 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
22850 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
22860 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
22870 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
22880 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
22890 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
228a0 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
228b0 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
228c0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
228d0 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
228e0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
228f0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
22900 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
22910 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
22920 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
22930 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
22940 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
22950 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
22960 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
22970 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
22980 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
22990 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
229a0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
229b0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
229c0 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
229d0 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
229e0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
229f0 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
22a00 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
22a10 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
22a20 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
22a30 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
22a40 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
22a50 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
22a60 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
22a70 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
22a80 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
22a90 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
22aa0 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
22ab0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
22ac0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
22ad0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
22ae0 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20   TK_ALL, 0));.  
22af0 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
22b00 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
22b10 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
22b20 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
22b30 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
22b40 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
22b50 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
22b60 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74   = 0;.  p->pNext
22b70 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68   = 0;.  p->pWith
22b80 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c   = 0;.  p->selFl
22b90 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
22ba0 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28  und;.  assert( (
22bb0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
22bc0 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29  _Converted)==0 )
22bd0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
22be0 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b  |= SF_Converted;
22bf0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
22c00 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20  >pPrior!=0 );.  
22c10 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  pNew->pPrior->pN
22c20 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
22c30 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
22c40 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
22c50 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
22c60 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23  C_Continue;.}..#
22c70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22c80 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67  IT_CTE./*.** Arg
22c90 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69  ument pWith (whi
22ca0 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  ch may be NULL) 
22cb0 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b  points to a link
22cc0 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65  ed list of neste
22cd0 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65  d .** WITH conte
22ce0 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20  xts, from inner 
22cf0 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66  to outermost. If
22d00 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74   the table ident
22d10 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f  ified by .** FRO
22d20 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
22d30 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79   pItem is really
22d40 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d   a common-table-
22d50 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29  expression (CTE)
22d60 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e   .** then return
22d70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
22d80 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e  e CTE definition
22d90 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e   for that table.
22da0 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65   Otherwise.** re
22db0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
22dc0 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   If a non-NULL v
22dd0 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
22de0 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74  , set *ppContext
22df0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
22e00 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20   With.** object 
22e10 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
22e20 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f  d CTE belongs to
22e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
22e40 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57 69  ct Cte *searchWi
22e50 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74  th(.  With *pWit
22e60 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
22e70 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
22e80 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54 48 20   outermost WITH 
22e90 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
22ea0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22eb0 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46  *pItem,     /* F
22ec0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
22ed0 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f  nt to resolve */
22ee0 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74  .  With **ppCont
22ef0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
22f00 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20     /* OUT: WITH 
22f10 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76 61  clause return va
22f20 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  lue belongs to *
22f30 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
22f40 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
22f50 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
22f60 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  ==0 && (zName = 
22f70 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30  pItem->zName)!=0
22f80 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b   ){.    With *p;
22f90 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68  .    for(p=pWith
22fa0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72  ; p; p=p->pOuter
22fb0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
22fc0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
22fd0 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
22fe0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
22ff0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
23000 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
23010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
23020 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b   *ppContext = p;
23030 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
23040 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  n &p->a[i];.    
23050 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23060 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23070 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f   0;.}../* The co
23080 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69  de generator mai
23090 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f  ntains a stack o
230a0 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63 6c  f active WITH cl
230b0 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68  auses.** with th
230c0 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54  e inner-most WIT
230d0 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61  H clause being a
230e0 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
230f0 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
23100 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65  is routine pushe
23110 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75 73  s the WITH claus
23120 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
23130 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
23140 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20  ** onto the top 
23150 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  of the stack. If
23160 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20   argument bFree 
23170 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
23180 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  is.** WITH claus
23190 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
231a0 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
231b0 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  stack. In this c
231c0 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64  ase it.** should
231d0 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
231e0 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20 6f  with the Parse o
231f0 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20  bject. In other 
23200 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62  cases, when.** b
23210 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74  Free==0, the Wit
23220 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  h object will be
23230 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
23240 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a  h the SELECT .**
23250 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
23260 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73 6f  which it is asso
23270 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ciated..*/.void 
23280 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
23290 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
232a0 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62  ith *pWith, u8 b
232b0 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Free){.  assert(
232c0 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61   bFree==0 || pPa
232d0 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b  rse->pWith==0 );
232e0 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
232f0 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65      pWith->pOute
23300 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  r = pParse->pWit
23310 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
23320 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
23330 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65 65 57    pParse->bFreeW
23340 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d  ith = bFree;.  }
23350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23360 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
23370 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
23380 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
23390 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
233a0 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
233b0 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
233c0 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
233d0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
233e0 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
233f0 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
23400 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
23410 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
23420 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
23430 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
23440 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
23450 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
23460 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
23470 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
23480 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
23490 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
234a0 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
234b0 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
234c0 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
234d0 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
234e0 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
234f0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
23500 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
23510 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
23520 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
23530 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
23540 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
23550 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
23560 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
23570 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
23580 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
23590 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
235a0 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
235b0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
235c0 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
235d0 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
235e0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
235f0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
23600 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
23610 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
23620 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
23630 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
23640 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
23650 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
23660 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
23670 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23680 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
23690 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
236a0 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
236b0 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
236c0 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
236d0 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
236f0 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
23700 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
23710 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
23720 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
23730 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
23740 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
23750 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
23760 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
23770 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
23780 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
23790 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
237a0 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
237b0 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
237c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
237d0 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
237e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
237f0 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
23800 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
23810 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
23820 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
23830 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
23840 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
23850 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
23860 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
23870 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
23880 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
23890 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 6e   pCte->zErr is n
238a0 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20  on-NULL at this 
238b0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
238c0 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20   is an illegal. 
238d0 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20     ** recursive 
238e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45  reference to CTE
238f0 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20   pCte. Leave an 
23900 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20  error in pParse 
23910 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  and return.    *
23920 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65  * early. If pCte
23930 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  ->zErr is NULL, 
23940 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
23950 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
23960 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
23970 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
23980 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
23990 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b 0a  ( pCte->zErr ){.
239a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
239b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
239c0 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d 3e  te->zErr, pCte->
239d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
239e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
239f0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  R;.    }..    as
23a00 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
23a10 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f  b==0 );.    pFro
23a20 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
23a30 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
23a40 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
23a50 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
23a60 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
23a70 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
23a80 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
23a90 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
23aa0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
23ab0 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  up(db, pCte->zNa
23ac0 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  me);.    pTab->i
23ad0 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70  PKey = -1;.    p
23ae0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
23af0 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
23b00 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
23b10 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
23b20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
23b30 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
23b40 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52   | TF_NoVisibleR
23b50 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  owid;.    pFrom-
23b60 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
23b70 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
23b80 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
23b90 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
23ba0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
23bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
23bc0 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  M;.    assert( p
23bd0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b  From->pSelect );
23be0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
23bf0 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75  f this is a recu
23c00 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20  rsive CTE. */.  
23c10 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e    pSel = pFrom->
23c20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61  pSelect;.    bMa
23c30 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70  yRecursive = ( p
23c40 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  Sel->op==TK_ALL 
23c50 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f  || pSel->op==TK_
23c60 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  UNION );.    if(
23c70 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
23c80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
23c90 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53       SrcList *pS
23ca0 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  rc = pFrom->pSel
23cb0 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20  ect->pSrc;.     
23cc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
23cd0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
23ce0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
23cf0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23d00 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a   = &pSrc->a[i];.
23d10 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
23d20 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
23d30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74  .         && pIt
23d40 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20  em->zName!=0 .  
23d50 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
23d60 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65  ite3StrICmp(pIte
23d70 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e  m->zName, pCte->
23d80 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20  zName).         
23d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
23da0 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  tem->pTab = pTab
23db0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
23dc0 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d  m->isRecursive =
23dd0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
23de0 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
23df0 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
23e00 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72  lags |= SF_Recur
23e10 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sive;.        }.
23e20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
23e30 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72     /* Only one r
23e40 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
23e50 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ce is permitted.
23e60 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61   */ .    if( pTa
23e70 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20  b->nRef>2 ){.   
23e80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
23e90 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  sg(.          pP
23ea0 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20  arse, "multiple 
23eb0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65  references to re
23ec0 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25  cursive table: %
23ed0 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a  s", pCte->zName.
23ee0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
23ef0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23f00 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OR;.    }.    as
23f10 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66  sert( pTab->nRef
23f20 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73  ==1 || ((pSel->s
23f30 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
23f40 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
23f50 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20  Ref==2 ));..    
23f60 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69  pCte->zErr = "ci
23f70 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65  rcular reference
23f80 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65  : %s";.    pSave
23f90 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e  dWith = pParse->
23fa0 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
23fb0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
23fc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
23fd0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
23fe0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f   bMayRecursive ?
23ff0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20   pSel->pPrior : 
24000 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pSel);..    for(
24010 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
24020 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
24030 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
24040 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
24050 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
24060 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
24070 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
24080 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
24090 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
240a0 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
240b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
240c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
240d0 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61  ble %s has %d va
240e0 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75  lues for %d colu
240f0 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mns",.          
24100 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70    pCte->zName, p
24110 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43  EList->nExpr, pC
24120 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
24130 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
24140 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
24150 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
24160 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
24170 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
24180 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
24190 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
241a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65  .    }..    sele
241b0 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
241c0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
241d0 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
241e0 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
241f0 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
24200 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
24210 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  if( pSel->selFla
24220 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
24230 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  e ){.        pCt
24240 65 2d 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69  e->zErr = "multi
24250 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65  ple recursive re
24260 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20  ferences: %s";. 
24270 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24280 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
24290 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
242a0 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
242b0 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
242c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
242d0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
242e0 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
242f0 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
24300 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
24310 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
24320 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  th;.  }..  retur
24330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
24340 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
24350 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
24360 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
24370 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65  CT passed as the
24380 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
24390 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74   has an associat
243a0 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75  ed WITH .** clau
243b0 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20  se, pop it from 
243c0 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64  the stack stored
243d0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
243e0 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Parse object..**
243f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24400 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  n is used as the
24410 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
24420 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a  2() callback by.
24430 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
24440 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61  Expand() when wa
24450 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74  lking a SELECT t
24460 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  ree to resolve t
24470 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e  able.** names an
24480 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  d other FROM cla
24490 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a  use elements. .*
244a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
244b0 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b  lectPopWith(Walk
244c0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
244d0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
244e0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
244f0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69  er->pParse;.  Wi
24500 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64  th *pWith = find
24510 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
24520 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ith;.  if( pWith
24530 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
24540 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
24550 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70  ==pWith );.    p
24560 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
24570 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  With->pOuter;.  
24580 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
24590 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  e selectPopWith 
245a0 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
245b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
245c0 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
245d0 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
245e0 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
245f0 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
24600 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
24610 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
24620 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
24630 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
24640 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
24650 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
24660 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
24670 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
24680 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
24690 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
246a0 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
246b0 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
246c0 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
246d0 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
246e0 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
246f0 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
24700 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
24710 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
24720 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
24730 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
24740 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
24750 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
24760 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
24770 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
24780 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
24790 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
247a0 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
247b0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
247c0 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
247d0 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
247e0 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
247f0 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
24800 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
24810 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
24820 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
24830 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  ersistent repres
24840 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
24850 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
24860 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
24870 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
24880 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
24890 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
248a0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
248b0 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
248c0 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
248d0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
248e0 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
248f0 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
24900 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
24910 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
24920 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
24930 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
24940 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
24950 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
24960 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
24970 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
24980 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
24990 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
249a0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
249b0 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
249c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
249d0 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
249e0 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
249f0 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
24a00 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
24a10 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
24a20 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
24a30 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
24a40 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
24a50 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
24a60 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
24a70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
24a80 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
24a90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24aa0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
24ab0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
24ac0 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
24ad0 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
24ae0 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
24af0 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
24b00 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ;..  p->selFlags
24b10 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b   |= SF_Expanded;
24b20 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
24b30 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
24b40 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
24b50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
24b60 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  R(p->pSrc==0) ||
24b70 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
24b80 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
24b90 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
24ba0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
24bb0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
24bc0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
24bd0 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 57 61 6c  List;.  if( pWal
24be0 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c  ker->xSelectCall
24bf0 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f 70  back2==selectPop
24c00 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69  With ){.    sqli
24c10 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72  te3WithPush(pPar
24c20 73 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f 73  se, findRightmos
24c30 74 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b  t(p)->pWith, 0);
24c40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
24c50 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
24c60 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
24c70 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
24c80 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
24c90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
24ca0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
24cb0 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
24cc0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
24cd0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
24ce0 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
24cf0 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
24d00 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
24d10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
24d20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
24d30 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
24d40 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
24d50 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
24d60 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
24d70 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
24d80 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
24d90 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
24da0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
24db0 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
24dc0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
24dd0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
24de0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
24df0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
24e00 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
24e10 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
24e20 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 52  sert( pFrom->isR
24e30 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70  ecursive==0 || p
24e40 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20 20  From->pTab );.  
24e50 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 52    if( pFrom->isR
24e60 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69  ecursive ) conti
24e70 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46 72  nue;.    if( pFr
24e80 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
24e90 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
24ea0 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
24eb0 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
24ec0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
24ed0 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
24ee0 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
24ef0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
24f00 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
24f10 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
24f20 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68     selectPopWith
24f30 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23 65  (pWalker, p);.#e
24f40 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
24f50 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
24f60 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
24f70 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69  E_OMIT_CTE.    i
24f80 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57  f( withExpand(pW
24f90 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20  alker, pFrom) ) 
24fa0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
24fb0 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
24fc0 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a  >pTab ) {} else.
24fd0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
24fe0 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
24ff0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
25000 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
25010 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
25020 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
25030 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
25040 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
25050 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
25060 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
25070 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
25080 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
25090 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
250a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   );.      if( sq
250b0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
250c0 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29  pWalker, pSel) )
250d0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
250e0 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  t;.      pFrom->
250f0 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
25100 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
25110 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
25120 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  le));.      if( 
25130 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
25140 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25150 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
25160 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
25170 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
25180 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
25190 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29  _sq_%p", (void*)
251a0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
251b0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
251c0 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
251d0 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
251e0 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
251f0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
25200 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
25210 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
25220 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
25230 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
25240 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
25250 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
25260 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
25270 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
25280 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70  8576) );.      p
25290 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
252a0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23   TF_Ephemeral;.#
252b0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
252c0 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
252d0 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
252e0 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
252f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
25300 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
25310 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
25320 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
25330 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
25340 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
25350 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f  (pParse, 0, pFro
25360 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  m);.      if( pT
25370 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
25380 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
25390 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d  if( pTab->nRef==
253a0 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  0xffff ){.      
253b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
253c0 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
253d0 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  any references t
253e0 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35  o \"%s\": max 65
253f0 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20  535",.          
25400 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
25410 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54         pFrom->pT
25420 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
25430 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
25440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25450 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
25460 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
25470 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
25480 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
25490 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
254a0 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54  LE).      if( pT
254b0 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49  ab->pSelect || I
254c0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
254d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
254e0 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
254f0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
25500 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
25510 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
25520 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
25530 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
25540 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
25550 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25560 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25570 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
25580 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
25590 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
255a0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
255b0 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
255c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
255d0 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
255e0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70  From->pSelect, p
255f0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
25600 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25610 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
25620 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
25630 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
25640 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
25650 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
25660 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
25670 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
25680 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
25690 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
256a0 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
256b0 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
256c0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
256d0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
256e0 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
256f0 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
25700 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
25710 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
25720 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
25730 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
25740 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
25750 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
25760 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
25770 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
25780 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
25790 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
257a0 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
257b0 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
257c0 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
257d0 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
257e0 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
257f0 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
25800 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
25810 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
25820 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
25830 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
25840 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
25850 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
25860 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
25870 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
25880 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
25890 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
258a0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
258b0 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
258c0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
258d0 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
258e0 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
258f0 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
25900 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
25910 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
25920 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
25930 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
25940 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
25950 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
25960 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
25970 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
25980 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
25990 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
259a0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
259b0 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
259c0 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
259d0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
259e0 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
259f0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
25a00 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
25a10 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
25a20 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
25a30 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
25a40 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
25a50 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
25a60 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
25a70 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
25a80 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
25a90 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ALL ) break;.  }
25aa0 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
25ab0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
25ac0 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
25ad0 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
25ae0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
25af0 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
25b00 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
25b10 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
25b20 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
25b30 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
25b40 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
25b50 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
25b60 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
25b70 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
25b80 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
25b90 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
25ba0 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
25bb0 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
25bc0 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
25bd0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
25be0 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
25bf0 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
25c00 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
25c10 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
25c20 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
25c30 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
25c40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
25c50 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
25c60 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
25c70 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
25c80 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20   k++){.      pE 
25c90 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
25ca0 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d      pRight = pE-
25cb0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  >pRight;.      a
25cc0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
25cd0 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21  K_DOT || pRight!
25ce0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
25cf0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
25d00 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
25d10 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21  T || pRight->op!
25d20 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
25d30 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
25d40 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
25d50 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
25d60 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
25d70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25d80 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
25d90 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
25da0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
25db0 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
25dc0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
25dd0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
25de0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
25df0 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
25e00 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
25e10 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
25e20 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
25e30 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
25e40 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
25e50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
25e60 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
25e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
25e80 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
25e90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25ea0 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
25eb0 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
25ec0 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
25ed0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
25ee0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
25ef0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
25f00 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
25f10 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
25f20 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
25f30 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
25f40 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
25f50 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
25f60 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
25f70 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
25f80 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
25f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
25fa0 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
25fb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
25fc0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
25fd0 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
25fe0 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
25ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
26000 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
26010 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
26020 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
26030 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
26040 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
26050 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
26060 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
26070 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
26080 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
26090 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
260a0 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
260b0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
260c0 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
260d0 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
260e0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
260f0 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
26100 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
26110 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
26120 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
26130 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
26140 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
26150 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
26160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26170 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
26180 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
26190 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
261a0 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
261b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
261c0 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
261d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
261e0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
261f0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
26200 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
26210 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
26220 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
26230 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
26240 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26250 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
26260 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
26270 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
26280 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
26290 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
262a0 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
262b0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a  aDb[iDb].zName :
262c0 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
262d0 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
262e0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
262f0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
26300 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
26310 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
26320 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
26330 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
26340 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
26350 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
26360 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26370 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
26380 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
26390 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
263a0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
263b0 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
263c0 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
263d0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
263e0 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
263f0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
26400 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
26410 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
26420 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
26430 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
26440 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
26450 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
26460 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
26470 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
26480 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
26490 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
264a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
264b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
264c0 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
264d0 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
264e0 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20  den' (currently 
264f0 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20  only possible.  
26500 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
26510 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29   virtual tables)
26520 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  , do not include
26530 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e   it in the expan
26540 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
26550 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
26560 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
26570 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
26580 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  f( IsHiddenColum
26590 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
265a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
265b0 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74     assert(IsVirt
265c0 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20  ual(pTab));.    
265d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
265e0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
265f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61  }.            ta
26600 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20  bleSeen = 1;..  
26610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
26620 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29  0 && zTName==0 )
26630 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26640 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e  if( (pFrom->join
26650 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
26660 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
26670 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
26680 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
26690 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
266a0 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
266b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
266c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
266d0 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
266e0 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
266f0 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
26710 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
26720 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
26730 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
26740 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26750 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26760 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
26770 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
26780 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
26790 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
267b0 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
267c0 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
267d0 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
267e0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
267f0 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
26800 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
26810 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
26820 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26830 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26840 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26850 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26860 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
26870 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
26880 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
26890 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
268a0 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
268b0 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
268c0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
268d0 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
268e0 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
268f0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
26900 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
26910 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
26920 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
26930 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
26940 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
26950 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
26960 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
26970 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
26980 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
26990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
269a0 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29  f( zSchemaName )
269b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
269c0 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
269d0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
269e0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20   zSchemaName);. 
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
26a00 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
26a10 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
26a20 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  OT, pLeft, pExpr
26a30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
26a40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26a50 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
26a60 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
26a70 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
26a80 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
26a90 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
26aa0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
26ac0 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
26ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26ae0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
26af0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26b00 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
26b10 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
26b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
26b30 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
26b40 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
26b50 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
26b60 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
26b70 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d  name.z = zColnam
26b80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
26b90 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69  Colname.n = sqli
26ba0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
26bb0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
26bc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
26bd0 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
26be0 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d  , pNew, &sColnam
26bf0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
26c00 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28     if( pNew && (
26c10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
26c20 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20  _NestedFrom)!=0 
26c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26c40 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
26c50 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65  _item *pX = &pNe
26c60 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
26c70 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
26c80 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20     if( pSub ){. 
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
26ca0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
26cb0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
26cc0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
26cd0 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
26ce0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
26cf0 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
26d00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
26d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26d20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
26d30 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  an = sqlite3MPri
26d40 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25  ntf(db, "%s.%s.%
26d50 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
26d80 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62  SchemaName, zTab
26d90 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b  Name, zColname);
26da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26db0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
26dc0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
26dd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26de0 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70           pX->bSp
26df0 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20  anIsTab = 1;.   
26e00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
26e20 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65  Free(db, zToFree
26e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
26e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26e50 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
26e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
26e70 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
26e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
26e90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
26ea0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
26eb0 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
26ec0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26ed0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26ee0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
26ef0 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
26f00 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
26f10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
26f20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26f30 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
26f40 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
26f50 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
26f60 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23  st = pNew;.  }.#
26f70 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
26f80 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45  LUMN.  if( p->pE
26f90 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73  List && p->pELis
26fa0 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  t->nExpr>db->aLi
26fb0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
26fc0 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
26fd0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
26fe0 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
26ff0 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  y columns in res
27000 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23  ult set");.  }.#
27010 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57  endif.  return W
27020 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
27030 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74  /*.** No-op rout
27040 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ine for the pars
27050 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a  e-tree walker..*
27060 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
27070 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61  outine is the Wa
27080 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
27090 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  ck then expressi
270a0 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20  on trees.** are 
270b0 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61  walked without a
270c0 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67  ny actions being
270d0 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e   taken at each n
270e0 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79  ode.  Presumably
270f0 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  ,.** when this r
27100 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
27110 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  or Walker.xExprC
27120 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a  allback then .**
27130 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
27140 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74  allback is set t
27150 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75  o do something u
27160 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20  seful for every 
27170 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20  .** subquery in 
27180 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e  the parser tree.
27190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
271a0 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  xprWalkNoop(Walk
271b0 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70  er *NotUsed, Exp
271c0 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  r *NotUsed2){.  
271d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
271e0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
271f0 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ed2);.  return W
27200 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
27210 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
27220 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
27230 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
27240 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
27250 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
27260 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
27270 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
27280 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
27290 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
272a0 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
272b0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
272c0 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
272d0 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
272e0 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
272f0 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
27300 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
27310 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
27320 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
27330 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27340 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
27350 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
27360 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
27370 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
27380 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
27390 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
273a0 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
273b0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
273c0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
273d0 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
273e0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
273f0 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
27400 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
27410 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
27420 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
27430 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
27440 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
27450 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
27460 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
27470 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
27480 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
27490 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
274a0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
274b0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
274c0 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
274d0 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
274e0 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70   pParse;.  if( p
274f0 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
27500 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  nd ){.    w.xSel
27510 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
27520 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
27530 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
27540 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
27550 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
27560 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
27570 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
27580 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 69  ectExpander;.  i
27590 66 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  f( (pSelect->sel
275a0 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69  Flags & SF_Multi
275b0 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
275c0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
275d0 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57  ck2 = selectPopW
275e0 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ith;.  }.  sqlit
275f0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
27600 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
27610 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27620 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
27630 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
27640 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
27650 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
27660 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
27670 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
27680 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
27690 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
276a0 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
276b0 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
276c0 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
276d0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
276e0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
276f0 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
27700 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
27710 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
27720 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
27730 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
27740 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
27750 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
27760 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
27770 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
27780 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
27790 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
277a0 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
277b0 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
277c0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
277d0 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
277e0 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
277f0 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
27800 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
27810 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
27820 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
27830 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
27840 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75  void selectAddSu
27850 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
27860 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
27870 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
27880 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
27890 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
278a0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
278b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
278c0 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
278d0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
278e0 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
278f0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
27900 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
27910 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
27920 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
27930 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
27940 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c     pParse = pWal
27950 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  ker->pParse;.   
27960 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
27970 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
27980 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
27990 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
279a0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
279b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  m++){.      Tabl
279c0 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
279d0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
279e0 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29   ALWAYS(pTab!=0)
279f0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
27a00 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
27a10 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
27a20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
27a30 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
27a40 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
27a50 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
27a60 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
27a70 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
27a80 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
27a90 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
27aa0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  Sel->pPrior ) pS
27ab0 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
27ac0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c  r;.          sel
27ad0 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
27ae0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
27af0 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29  rse, pTab, pSel)
27b00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27b10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
27b20 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
27b30 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
27b40 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
27b50 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
27b60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
27b70 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
27b80 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
27b90 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
27ba0 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
27bb0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
27bc0 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
27bd0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
27be0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
27bf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
27c00 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
27c10 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
27c20 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
27c30 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
27c40 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
27c50 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
27c60 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
27c70 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
27c80 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
27c90 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71   = selectAddSubq
27ca0 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20  ueryTypeInfo;.  
27cb0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
27cc0 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  = exprWalkNoop;.
27cd0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
27ce0 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
27cf0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
27d00 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lect);.#endif.}.
27d10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
27d20 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53  tine sets up a S
27d30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
27d40 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  for processing. 
27d50 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
27d60 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
27d70 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  d:.**.**     *  
27d80 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62  VDBE Cursor numb
27d90 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64  ers are assigned
27da0 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   to all FROM-cla
27db0 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  use terms..**   
27dc0 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54    *  Ephemeral T
27dd0 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65  able objects are
27de0 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
27df0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
27e00 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20  queries..**     
27e10 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  *  ON and USING 
27e20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66  clauses are shif
27e30 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73  ted into WHERE s
27e40 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20  tatements.**    
27e50 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a   *  Wildcards "*
27e60 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20  " and "TABLE.*" 
27e70 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61  in result sets a
27e80 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20  re expanded..** 
27e90 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65      *  Identifie
27ea0 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  rs in expression
27eb0 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20   are matched to 
27ec0 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
27ed0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
27ee0 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61  recursively on a
27ef0 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69  ll subqueries wi
27f00 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e  thin the SELECT.
27f10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
27f20 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61  SelectPrep(.  Pa
27f30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
27f40 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
27f50 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
27f60 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
27f70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
27f80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
27f90 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
27fa0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
27fb0 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
27fc0 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74  context for cont
27fd0 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ainer */.){.  sq
27fe0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
27ff0 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
28000 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50  eturn;.  db = pP
28010 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
28020 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
28030 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
28040 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
28050 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
28060 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
28070 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
28080 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
28090 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
280a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
280b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
280c0 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
280d0 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
280e0 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
280f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
28100 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
28110 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
28120 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
28130 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
28140 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
28150 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
28160 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
28170 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
28180 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
28190 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
281a0 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
281b0 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
281c0 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
281d0 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
281e0 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
281f0 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
28200 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
28210 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
28220 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
28230 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
28240 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
28250 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
28260 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
28270 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
28280 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28290 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
282a0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
282b0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
282c0 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70  ;.  int nReg = p
282d0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b  AggInfo->nFunc +
282e0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75   pAggInfo->nColu
282f0 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  mn;.  if( nReg==
28300 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
28310 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28320 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
28330 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67   all AggInfo reg
28340 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69  isters are withi
28350 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63  n the range spec
28360 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67  ified by.  ** Ag
28370 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67  gInfo.mnReg..Agg
28380 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20  Info.mxReg */.  
28390 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41  assert( nReg==pA
283a0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41  ggInfo->mxReg-pA
283b0 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20  ggInfo->mnReg+1 
283c0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
283d0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
283e0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  n; i++){.    ass
283f0 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
28400 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  Col[i].iMem>=pAg
28410 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
28420 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
28430 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c  o->aCol[i].iMem<
28440 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
28450 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   );.  }.  for(i=
28460 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
28470 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
28480 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
28490 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e  ->aFunc[i].iMem>
284a0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
284b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
284c0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
284d0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
284e0 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e  mxReg );.  }.#en
284f0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dif.  sqlite3Vdb
28500 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
28510 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
28520 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f  >mnReg, pAggInfo
28530 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28  ->mxReg);.  for(
28540 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
28550 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
28560 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
28570 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
28580 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
28590 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
285a0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
285b0 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
285c0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
285d0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
285e0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
285f0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
28600 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
28610 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
28620 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
28630 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28640 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
28650 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
28660 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
28670 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
28680 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
28690 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
286a0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
286b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
286c0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
286d0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
286e0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
286f0 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29  ->x.pList, 0, 0)
28700 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28710 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
28720 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
28730 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
28740 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
28770 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
28780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28790 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
287a0 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
287b0 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
287c0 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
287d0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
287e0 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
287f0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
28800 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
28810 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
28820 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
28830 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
28840 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
28850 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
28860 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
28870 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
28880 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
28890 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
288a0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
288b0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
288c0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
288d0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
288e0 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
288f0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
28900 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
28910 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
28920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28930 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
28940 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
28950 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
28960 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
28990 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
289a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
289b0 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
289c0 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
289d0 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
289e0 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
289f0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
28a00 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
28a10 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
28a20 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
28a30 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
28a40 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
28a50 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
28a60 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
28a70 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
28a80 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
28a90 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
28aa0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
28ab0 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
28ac0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
28ad0 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
28ae0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
28af0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
28b00 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
28b10 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
28b20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
28b30 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
28b40 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
28b50 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
28b60 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
28b70 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
28b80 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
28b90 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
28ba0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
28bb0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
28bc0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
28bd0 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
28be0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
28bf0 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
28c00 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
28c10 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
28c20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28c30 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
28c40 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
28c50 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45  gAgg, SQLITE_ECE
28c60 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73  L_DUP);.    }els
28c70 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
28c80 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
28c90 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
28ca0 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
28cb0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
28cc0 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
28cd0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
28ce0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28cf0 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20   nArg==0 );  /* 
28d00 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  Error condition 
28d10 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
28d20 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f  e( nArg>1 );   /
28d30 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20  * Also an error 
28d40 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  */.      codeDis
28d50 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
28d60 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
28d70 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
28d80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
28d90 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
28da0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
28db0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
28dc0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
28dd0 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
28de0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
28df0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
28e00 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
28e10 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
28e20 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
28e30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
28e40 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
28e50 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
28e60 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
28e70 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
28e80 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
28e90 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
28ea0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
28eb0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
28ec0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
28ed0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
28ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
28ef0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
28f00 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
28f10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
28f20 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
28f30 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
28f40 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
28f50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
28f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28f70 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
28f80 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
28f90 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
28fa0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
28fb0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
28fc0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
28fd0 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41  ggStep0, 0, regA
28fe0 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20  gg, pF->iMem,.  
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
29010 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
29020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
29030 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
29040 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  8)nArg);.    sql
29050 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
29060 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
29070 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
29080 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
29090 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
290a0 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
290b0 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
290c0 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
290d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
290e0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
290f0 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ext);.      sqli
29100 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
29110 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
29120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
29130 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65  e populating the
29140 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
29150 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68  isters, clear th
29160 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
29170 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
29180 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65  if any of the re
29190 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61  quired column va
291a0 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79  lues are already
291b0 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69   present .  ** i
291c0 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c  n registers, sql
291d0 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d  ite3ExprCode() m
291e0 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20  ay use OP_SCopy 
291f0 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75  to copy the valu
29200 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d  e.  ** to pC->iM
29210 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74  em. But by the t
29220 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73  ime the value is
29230 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69   used, the origi
29240 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a  nal register.  *
29250 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  * may have been 
29260 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69  used, invalidati
29270 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ng the underlyin
29280 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67  g buffer holding
29290 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f   the.  ** text o
292a0 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65  r blob value. Se
292b0 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34  e ticket [883034
292c0 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dcb5]..  **.  **
292d0 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f   Another solutio
292e0 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68  n would be to ch
292f0 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70  ange the OP_SCop
29300 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63  y used to copy c
29310 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65  ached.  ** value
29320 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e  s to an OP_Copy.
29330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48  .  */.  if( regH
29340 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69  it ){.    addrHi
29350 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  tTest = sqlite3V
29360 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
29370 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62  If, regHit); Vdb
29380 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
29390 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
293a0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
293b0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
293c0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
293d0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
293e0 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
293f0 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
29400 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
29410 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
29420 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
29430 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
29440 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ode = 0;.  sqlit
29450 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
29460 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
29470 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
29480 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
29490 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
294a0 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
294b0 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
294c0 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
294d0 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
294e0 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
294f0 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
29500 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
29510 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
29520 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
29530 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29540 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
29550 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
29560 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
29570 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
29580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
29590 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
295a0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295c0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
295d0 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
295e0 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29600 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
29610 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
29620 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
29630 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
29640 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ==2 ){.    int b
29650 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30  Cover = (pIdx!=0
29660 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
29670 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72  ab) || !IsPrimar
29680 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29  yKeyIndex(pIdx))
29690 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71  );.    char *zEq
296a0 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  p = sqlite3MPrin
296b0 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
296c0 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25  SCAN TABLE %s%s%
296d0 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
296e0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
296f0 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e   bCover ? " USIN
29700 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
29710 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20   " : "",.       
29720 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e   bCover ? pIdx->
29730 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29  zName : "".    )
29740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
29750 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
29760 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20   pParse->pVdbe, 
29770 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
29780 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
29790 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59  , 0, zEqp, P4_DY
297a0 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d  NAMIC.    );.  }
297b0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
297c0 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
297d0 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
297e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
297f0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
29800 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29810 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20   given in the p 
29820 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  argument.  .**.*
29830 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
29840 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72  e returned accor
29850 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65  ding to the Sele
29860 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65  ctDest structure
29870 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
29880 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  s in sqliteInt.h
29890 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66   for further inf
298a0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
298b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
298c0 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
298d0 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
298e0 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
298f0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
29900 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
29910 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
29920 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
29930 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
29940 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
29950 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
29960 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
29970 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
29980 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
29990 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
299a0 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e  o do that..*/.in
299b0 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
299c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
299d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
299e0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
299f0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
29a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29a10 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
29a20 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
29a30 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
29a40 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20   *pDest      /* 
29a50 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
29a60 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
29a70 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
29a80 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
29a90 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29aa0 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  s */.  WhereInfo
29ab0 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a   *pWInfo;     /*
29ac0 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c   Return from sql
29ad0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
29ae0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
29af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b00 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
29b10 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
29b20 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
29b30 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
29b40 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
29b50 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
29b60 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
29b70 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
29b80 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20  t = 0;  /* List 
29b90 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
29ba0 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
29bb0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
29bc0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
29bd0 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
29be0 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
29bf0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
29c00 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
29c10 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
29c20 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
29c30 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
29c40 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
29c50 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
29c60 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
29c70 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
29c80 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
29c90 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
29ca0 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  L */.  int rc = 
29cb0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
29cc0 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
29cd0 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
29ce0 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63  ion */.  Distinc
29cf0 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20  tCtx sDistinct; 
29d00 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
29d10 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49  o code the DISTI
29d20 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20  NCT keyword */. 
29d30 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20   SortCtx sSort; 
29d40 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
29d50 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
29d60 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
29d70 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  se */.  AggInfo 
29d80 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
29d90 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
29da0 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
29db0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
29dc0 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
29dd0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
29de0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
29df0 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
29e00 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
29e10 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
29e20 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
29e30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
29e40 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
29e50 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65  int iRestoreSele
29e60 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
29e70 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72  SelectId;.  pPar
29e80 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20  se->iSelectId = 
29e90 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
29ea0 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ectId++;.#endif.
29eb0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
29ec0 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  db;.  if( p==0 |
29ed0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
29ee0 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
29ef0 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rr ){.    return
29f00 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
29f10 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
29f20 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
29f30 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
29f40 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
29f50 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30  set(&sAggInfo, 0
29f60 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66  , sizeof(sAggInf
29f70 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  o));.#if SELECTT
29f80 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
29f90 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
29fa0 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54  dent++;.  SELECT
29fb0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
29fc0 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73  , ("begin proces
29fd0 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66  sing:\n"));.  if
29fe0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
29ff0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2a000 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2a010 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2a020 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2a030 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2a040 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2a050 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
2a060 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
2a070 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2a080 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2a090 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
2a0a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2a0b0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2a0c0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
2a0d0 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
2a0e0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2a0f0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2a100 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
2a110 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
2a120 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2a130 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
2a140 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a150 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
2a160 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
2a170 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
2a180 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a190 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
2a1a0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2a1b0 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
2a1c0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2a1d0 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
2a1e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a1f0 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
2a200 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2a210 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
2a220 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
2a230 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
2a240 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
2a250 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
2a260 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
2a270 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
2a280 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
2a290 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
2a2a0 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
2a2b0 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
2a2c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2a2d0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
2a2e0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
2a2f0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
2a300 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
2a310 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
2a320 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
2a330 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
2a340 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20   memset(&sSort, 
2a350 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29  0, sizeof(sSort)
2a360 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  );.  sSort.pOrde
2a370 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
2a380 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
2a390 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
2a3a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
2a3b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a3c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
2a3d0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73  ct_end;.  }.  as
2a3e0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
2a3f0 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20  =0 );.  isAgg = 
2a400 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2a410 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
2a420 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2a430 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2a440 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2a450 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2a460 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
2a470 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  00,pParse,p, ("a
2a480 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
2a490 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
2a4a0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2a4b0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2a4c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f    }.#endif...  /
2a4d0 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
2a4e0 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
2a4f0 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
2a500 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
2a510 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
2a520 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ut..  */.#ifndef
2a530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2a540 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63  QUERY.  if( chec
2a550 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
2a560 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
2a570 65 2c 20 70 44 65 73 74 2c 20 70 2d 3e 70 45 4c  e, pDest, p->pEL
2a580 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
2a590 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2a5a0 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
2a5b0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c 61 74    /* Try to flat
2a5c0 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
2a5d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a5e0 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61  e up into the ma
2a5f0 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69  in query.  */.#i
2a600 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2a610 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
2a620 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2a630 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
2a640 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
2a650 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
2a660 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2a670 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2a680 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2a690 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2a6a0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
2a6b0 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
2a6c0 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41  ect;.    int isA
2a6d0 67 67 53 75 62 3b 0a 20 20 20 20 69 66 28 20 70  ggSub;.    if( p
2a6e0 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
2a6f0 65 3b 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  e;.    isAggSub 
2a700 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
2a710 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2a720 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
2a730 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
2a740 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
2a750 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
2a760 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
2a770 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
2a780 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
2a790 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2a7a0 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
2a7b0 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
2a7c0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
2a7d0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
2a7e0 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
2a7f0 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
2a800 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
2a810 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
2a820 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2a830 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2a840 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2a850 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
2a860 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2a870 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2a880 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2a890 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2a8a0 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  f..  /* Get a po
2a8b0 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75  inter the VDBE u
2a8c0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2a8d0 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  n, allocating a 
2a8e0 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a  new VDBE if one.
2a8f0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c    ** does not al
2a900 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20  ready exist */. 
2a910 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
2a920 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
2a930 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
2a940 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e  elect_end;..#ifn
2a950 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a960 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
2a970 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
2a980 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
2a990 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
2a9a0 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
2a9b0 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
2a9c0 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
2a9d0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
2a9e0 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
2a9f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
2aa00 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c  pDest);.    expl
2aa10 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
2aa20 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2aa30 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2aa40 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  d);.#if SELECTTR
2aa50 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2aa60 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2aa70 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
2aa80 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
2aa90 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
2aaa0 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2aab0 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
2aac0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  f.    return rc;
2aad0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2aae0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2aaf0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
2ab00 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2ab10 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
2ab20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2ab30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2ab40 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2ab50 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
2ab60 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2ab70 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2ab80 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2ab90 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2aba0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2abb0 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
2abc0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
2abd0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2abe0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
2abf0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2ac00 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
2ac10 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
2ac20 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
2ac30 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2ac40 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
2ac50 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
2ac60 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
2ac70 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2ac80 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
2ac90 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
2aca0 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
2acb0 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
2acc0 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
2acd0 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
2ace0 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
2acf0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
2ad00 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
2ad10 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
2ad20 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
2ad30 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
2ad40 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
2ad50 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
2ad60 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
2ad70 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
2ad80 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
2ad90 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2ada0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
2adb0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2adc0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  >viaCoroutine==0
2add0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2ade0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2adf0 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
2ae00 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
2ae10 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
2ae20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ae30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2ae40 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
2ae50 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
2ae60 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
2ae70 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
2ae80 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
2ae90 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
2aea0 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
2aeb0 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
2aec0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
2aed0 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
2aee0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
2aef0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
2af00 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
2af10 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
2af20 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
2af30 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
2af40 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
2af50 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
2af60 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
2af70 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
2af80 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
2af90 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
2afa0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
2afb0 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
2afc0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2afd0 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
2afe0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63  Make copies of c
2aff0 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c  onstant WHERE-cl
2b000 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68  ause terms in th
2b010 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
2b020 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65  wn.    ** inside
2b030 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
2b040 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68  This can help th
2b050 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75  e subquery to ru
2b060 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  n more efficient
2b070 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2b080 66 28 20 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  f( (pItem->joint
2b090 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d  ype & JT_OUTER)=
2b0a0 3d 30 0a 20 20 20 20 20 26 26 20 70 75 73 68 44  =0.     && pushD
2b0b0 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 64 62  ownWhereTerms(db
2b0c0 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72  , pSub, p->pWher
2b0d0 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
2b0e0 72 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45  r).    ){.#if SE
2b0f0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2b100 44 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  D.      if( sqli
2b110 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2b120 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
2b130 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2b140 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  100,pParse,p,("A
2b150 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73  fter WHERE-claus
2b160 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29  e push-down:\n")
2b170 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2b180 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2b190 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
2b1a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2b1b0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
2b1c0 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
2b1d0 6e 74 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  nt the subquery.
2b1e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2b1f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
2b200 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c  .     && (p->sel
2b210 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 29 3d  Flags & SF_All)=
2b220 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  =0.     && Optim
2b230 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
2b240 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f  b, SQLITE_SubqCo
2b250 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a  routine).    ){.
2b260 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65        /* Impleme
2b270 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  nt a co-routine 
2b280 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e  that will return
2b290 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2b2a0 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2b2b0 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68    ** set on each
2b2c0 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
2b2d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
2b2e0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
2b2f0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2b300 28 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74  (v)+1;.      pIt
2b310 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2b320 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2b330 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b340 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
2b350 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  itCoroutine, pIt
2b360 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30  em->regReturn, 0
2b370 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
2b380 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2b390 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  , "%s", pItem->p
2b3a0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2b3b0 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
2b3c0 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
2b3d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2b3e0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
2b3f0 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
2b400 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2b410 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70  turn);.      exp
2b420 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2b430 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
2b440 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
2b450 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
2b460 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2b470 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
2b480 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
2b490 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
2b4a0 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  gEst = sqlite3Lo
2b4b0 67 45 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65  gEst(pSub->nSele
2b4c0 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 70 49  ctRow);.      pI
2b4d0 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
2b4e0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74  e = 1;.      pIt
2b4f0 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20  em->regResult = 
2b500 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20  dest.iSdst;.    
2b510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b520 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
2b530 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2b540 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2b550 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2b560 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d  Here(v, addrTop-
2b570 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2b580 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2b590 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
2b5a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2b5b0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2b5c0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2b5d0 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
2b5e0 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
2b5f0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
2b600 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
2b610 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
2b620 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
2b630 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
2b640 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2b650 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
2b660 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
2b670 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
2b680 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
2b690 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
2b6a0 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
2b6b0 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
2b6c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b6d0 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
2b6e0 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
2b6f0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
2b700 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73  etAddr;.      as
2b710 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64  sert( pItem->add
2b720 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20  rFillSub==0 );. 
2b730 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2b740 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
2b750 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f  ->nMem;.      to
2b760 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  pAddr = sqlite3V
2b770 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b780 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65  Integer, 0, pIte
2b790 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2b7a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
2b7b0 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64  FillSub = topAdd
2b7c0 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r+1;.      if( p
2b7d0 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
2b7e0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
2b7f0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   /* If the subqu
2b800 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65  ery is not corre
2b810 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
2b820 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
2b830 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
2b840 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
2b850 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
2b860 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
2b870 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
2b880 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
2b890 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
2b8a0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
2b8b0 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
2b8c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2b8d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2b8e0 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
2b8f0 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
2b900 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2b910 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2b920 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
2b930 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
2b940 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
2b950 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2b960 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
2b970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
2b980 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
2b990 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
2b9a0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2b9b0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
2b9c0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2b9d0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
2b9e0 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
2b9f0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
2ba00 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
2ba10 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
2ba20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2ba30 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2ba40 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2ba50 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  (pSub->nSelectRo
2ba60 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  w);.      if( on
2ba70 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  ceAddr ) sqlite3
2ba80 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2ba90 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20  onceAddr);.     
2baa0 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74   retAddr = sqlit
2bab0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2bac0 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  OP_Return, pItem
2bad0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2bae0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2baf0 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49  (v, "end %s", pI
2bb00 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2bb10 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2bb20 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
2bb30 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64   topAddr, retAdd
2bb40 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2bb50 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2bb60 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
2bb70 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
2bb80 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2bb90 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2bba0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
2bbb0 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
2bbc0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
2bbd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2bbe0 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e  * Various elemen
2bbf0 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
2bc00 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63   copied into loc
2bc10 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72  al variables for
2bc20 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63  .  ** convenienc
2bc30 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
2bc40 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68  p->pEList;.  pWh
2bc50 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
2bc60 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
2bc70 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
2bc80 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
2bc90 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
2bca0 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
2bcb0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2bcc0 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c  ct)!=0;..#if SEL
2bcd0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2bce0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2bcf0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2bd00 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2bd10 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2bd20 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20  e,p,("After all 
2bd30 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c  FROM-clause anal
2bd40 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ysis:\n"));.    
2bd50 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2bd60 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2bd70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2bd80 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2bd90 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61   DISTINCT with a
2bda0 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69  n ORDER BY but i
2bdb0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
2bdc0 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66  te, and .  ** if
2bdd0 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   the select-list
2bde0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2bdf0 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
2be00 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65  t, then this que
2be10 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72  ry.  ** can be r
2be20 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52  ewritten as a GR
2be30 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72  OUP BY. In other
2be40 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20   words, this:.  
2be50 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2be60 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20  CT DISTINCT xyz 
2be70 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
2be80 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
2be90 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
2bea0 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
2beb0 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d   SELECT xyz FROM
2bec0 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79   ... GROUP BY xy
2bed0 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  z ORDER BY xyz. 
2bee0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
2bef0 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
2bf00 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
2bf10 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
2bf20 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
2bf30 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
2bf40 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
2bf50 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
2bf60 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
2bf70 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
2bf80 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
2bf90 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
2bfa0 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
2bfb0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
2bfc0 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
2bfd0 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
2bfe0 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
2bff0 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
2c000 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
2c010 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
2c020 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
2c030 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
2c040 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
2c050 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
2c060 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53  prListCompare(sS
2c070 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45  ort.pOrderBy, pE
2c080 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29  List, -1)==0.  )
2c090 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
2c0a0 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
2c0b0 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  t;.    pGroupBy 
2c0c0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  = p->pGroupBy = 
2c0d0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2c0e0 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30  up(db, pEList, 0
2c0f0 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65  );.    /* Notice
2c100 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
2c110 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68  ht SF_Distinct h
2c120 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20  as been cleared 
2c130 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  from p->selFlags
2c140 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69  ,.    ** the sDi
2c150 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73  stinct.isTnct is
2c160 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e   still set.  Hen
2c170 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65  ce, isTnct repre
2c180 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a  sents the.    **
2c190 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e   original settin
2c1a0 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74  g of the SF_Dist
2c1b0 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74  inct flag, not t
2c1c0 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
2c1d0 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ng */.    assert
2c1e0 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2c1f0 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ct );.  }..  /* 
2c200 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
2c210 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2c220 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65  then create an e
2c230 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
2c240 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f  o.  ** do the so
2c250 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73  rting.  But this
2c260 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72   sorting ephemer
2c270 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  al index might e
2c280 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67  nd up.  ** being
2c290 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
2c2a0 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61  ata can be extra
2c2b0 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
2c2c0 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49  ed order..  ** I
2c2d0 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
2c2e0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f  se, then the OP_
2c2f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
2c300 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
2c310 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74  e.  ** changed t
2c320 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
2c330 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  e we figure out 
2c340 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
2c350 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e   index is.  ** n
2c360 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
2c370 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2c380 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20  dex variable is 
2c390 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
2c3a0 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61  te.  ** that cha
2c3b0 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
2c3c0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
2c3d0 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
2c3e0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
2c3f0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
2c400 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2c410 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  se, sSort.pOrder
2c420 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e  By, 0, pEList->n
2c430 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74  Expr);.    sSort
2c440 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  .iECursor = pPar
2c450 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2c460 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2c470 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
2c480 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2c490 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2c4a0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f  l,.          sSo
2c4b0 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f  rt.iECursor, sSo
2c4c0 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  rt.pOrderBy->nEx
2c4d0 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78  pr+1+pEList->nEx
2c4e0 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
2c4f0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2c500 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20  , P4_KEYINFO.   
2c510 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
2c520 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
2c530 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
2c540 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
2c550 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
2c560 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
2c570 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
2c580 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
2c590 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
2c5a0 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
2c5b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2c5c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
2c5d0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
2c5e0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c  st->iSDParm, pEL
2c5f0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
2c600 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
2c610 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
2c620 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
2c630 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2c640 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2c650 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a   LARGEST_INT64;.
2c660 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
2c670 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
2c680 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20  p, iEnd);.  if( 
2c690 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20  p->iLimit==0 && 
2c6a0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2c6b0 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex>=0 ){.    sq
2c6c0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
2c6d0 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
2c6e0 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d  Index)->opcode =
2c6f0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a   OP_SorterOpen;.
2c700 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c      sSort.sortFl
2c710 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f  ags |= SORTFLAG_
2c720 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a  UseSorter;.  }..
2c730 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68    /* Open an eph
2c740 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20  emeral index to 
2c750 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
2c760 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
2c770 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2c780 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
2c790 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2c7a0 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65  tabTnct = pParse
2c7b0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44  ->nTab++;.    sD
2c7c0 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74  istinct.addrTnct
2c7d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2c7e0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2c7f0 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
2c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c810 20 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74         sDistinct
2c820 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a  .tabTnct, 0, 0,.
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c840 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2c850 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  ar*)keyInfoFromE
2c860 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2c870 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a  p->pEList,0,0),.
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
2c8a0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
2c8b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2c8c0 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
2c8d0 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74  ERED);.    sDist
2c8e0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2c8f0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2c900 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c  UNORDERED;.  }el
2c910 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  se{.    sDistinc
2c920 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
2c930 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
2c940 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69  P;.  }..  if( !i
2c950 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
2c960 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  ==0 ){.    /* No
2c970 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2c980 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55  ions and no GROU
2c990 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
2c9a0 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67     u16 wctrlFlag
2c9b0 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69  s = (sDistinct.i
2c9c0 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41  sTnct ? WHERE_WA
2c9d0 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29  NT_DISTINCT : 0)
2c9e0 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
2c9f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2ca00 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f  n. */.    pWInfo
2ca10 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2ca20 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2ca30 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73  bList, pWhere, s
2ca40 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20  Sort.pOrderBy,. 
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
2ca70 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c  >pEList, wctrlFl
2ca80 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ags, 0);.    if(
2ca90 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
2caa0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2cab0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2cac0 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
2cad0 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53  (pWInfo) < p->nS
2cae0 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20  electRow ){.    
2caf0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2cb00 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  = sqlite3WhereOu
2cb10 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
2cb20 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
2cb30 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  if( sDistinct.is
2cb40 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57  Tnct && sqlite3W
2cb50 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
2cb60 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  WInfo) ){.      
2cb70 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2cb80 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ype = sqlite3Whe
2cb90 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2cba0 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
2cbb0 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2cbc0 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  By ){.      sSor
2cbd0 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74  t.nOBSat = sqlit
2cbe0 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
2cbf0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2cc00 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74  if( sSort.nOBSat
2cc10 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ==sSort.pOrderBy
2cc20 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2cc30 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2cc40 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
2cc50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2cc60 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
2cc70 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
2cc80 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
2cc90 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
2cca0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
2ccb0 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
2ccc0 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
2ccd0 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
2cce0 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a  nEphemeral.    *
2ccf0 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
2cd00 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
2cd10 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  ( sSort.addrSort
2cd20 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72  Index>=0 && sSor
2cd30 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  t.pOrderBy==0 ){
2cd40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2cd50 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
2cd60 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
2cd70 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20  Index);.    }.. 
2cd80 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74     /* Use the st
2cd90 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
2cda0 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74  p. */.    select
2cdb0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
2cdc0 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c  , p, pEList, -1,
2cdd0 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69   &sSort, &sDisti
2cde0 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
2cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce00 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74  sqlite3WhereCont
2ce10 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f  inueLabel(pWInfo
2ce20 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2ce30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2ce40 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
2ce50 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Info));..    /* 
2ce60 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
2ce70 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
2ce80 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
2ce90 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2cea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2ceb0 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74  This case when t
2cec0 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65  here exist aggre
2ced0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
2cee0 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
2cef0 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  use.    ** or bo
2cf00 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  th */.    NameCo
2cf10 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
2cf20 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
2cf30 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
2cf40 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
2cf50 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
2cf60 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
2cf70 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
2cf80 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
2cf90 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
2cfa0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
2cfb0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2cfc0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2cfd0 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
2cfe0 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
2cff0 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
2d000 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
2d010 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
2d020 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
2d030 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2d050 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
2d060 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
2d070 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
2d080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d090 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
2d0a0 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
2d0b0 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
2d0c0 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
2d0d0 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
2d0e0 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
2d0f0 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
2d100 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
2d110 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
2d120 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
2d130 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
2d140 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
2d150 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2d160 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
2d170 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
2d180 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
2d190 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
2d1a0 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
2d1b0 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
2d1c0 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
2d1d0 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
2d1e0 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
2d1f0 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
2d200 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64  r */.    int ord
2d210 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20  erByGrp = 0; /* 
2d220 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55  True if the GROU
2d230 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42  P BY and ORDER B
2d240 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a  Y are the same *
2d250 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  /..    /* Remove
2d260 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69   any and all ali
2d270 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  ases between the
2d280 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
2d290 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50  the.    ** GROUP
2d2a0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
2d2b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
2d2c0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
2d2d0 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
2d2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2d2f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2d300 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2d310 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2d320 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
2d330 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e   over expression
2d340 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20   in a list */.. 
2d350 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45       for(k=p->pE
2d360 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
2d370 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  em=p->pEList->a;
2d380 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
2d390 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
2d3a0 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
2d3b0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2d3c0 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79    for(k=pGroupBy
2d3d0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
2d3e0 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b  GroupBy->a; k>0;
2d3f0 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
2d400 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
2d410 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
2d420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2d430 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31   p->nSelectRow>1
2d440 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  00 ) p->nSelectR
2d450 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65  ow = 100;.    }e
2d460 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  lse{.      p->nS
2d470 65 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20  electRow = 1;.  
2d480 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2d490 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
2d4a0 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
2d4b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
2d4c0 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
2d4d0 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
2d4e0 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
2d4f0 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
2d500 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2d510 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
2d520 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
2d530 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
2d540 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
2d550 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
2d560 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
2d570 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
2d580 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
2d590 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  e GROUP BY might
2d5a0 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
2d5b0 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
2d5c0 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
2d5d0 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
2d5e0 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
2d5f0 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
2d600 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
2d610 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
2d620 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
2d630 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
2d640 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
2d650 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
2d660 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
2d670 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
2d680 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
2d690 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
2d6a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
2d6b0 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
2d6c0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
2d6d0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
2d6e0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
2d6f0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
2d700 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
2d710 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
2d720 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
2d730 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
2d740 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
2d750 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2d760 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
2d770 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
2d780 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
2d790 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
2d7a0 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
2d7b0 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
2d7c0 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
2d7d0 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
2d7e0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
2d7f0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
2d800 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
2d810 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
2d820 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
2d830 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
2d840 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
2d850 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
2d860 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
2d870 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
2d880 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
2d890 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mnReg = pParse-
2d8a0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67  >nMem+1;.    sAg
2d8b0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2d8c0 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
2d8d0 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
2d8e0 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  r : 0;.    sAggI
2d8f0 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
2d900 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
2d910 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2d920 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
2d930 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
2d940 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2d950 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e  ist(&sNC, sSort.
2d960 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
2d970 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
2d980 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2d990 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2d9a0 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
2d9b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2d9c0 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
2d9d0 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
2d9e0 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
2d9f0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
2da00 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
2da10 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2da20 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
2da30 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2da40 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2da50 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
2da60 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67  lags |= NC_InAgg
2da70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
2da80 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2da90 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
2daa0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
2dab0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
2dac0 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2dad0 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e   &= ~NC_InAggFun
2dae0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  c;.    }.    sAg
2daf0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50  gInfo.mxReg = pP
2db00 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2db10 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2db20 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2db30 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
2db40 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
2db50 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
2db60 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
2db70 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
2db80 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
2db90 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
2dba0 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
2dbb0 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
2dbc0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
2dbd0 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
2dbe0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
2dbf0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
2dc00 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
2dc10 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
2dc20 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20  .      int j1;  
2dc30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d             /* A-
2dc40 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
2dc50 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
2dc60 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
2dc70 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
2dc80 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
2dc90 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
2dca0 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
2dcb0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
2dcc0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
2dcd0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
2dce0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
2dcf0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
2dd00 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
2dd10 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
2dd20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
2dd30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2dd40 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
2dd50 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
2dd60 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
2dd70 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
2dd80 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
2dd90 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
2dda0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2ddb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2ddc0 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
2ddd0 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
2dde0 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
2ddf0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
2de00 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
2de10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2de20 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
2de30 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
2de40 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
2de50 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2de60 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2de70 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
2de80 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
2de90 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
2dea0 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
2deb0 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
2dec0 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
2ded0 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
2dee0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
2def0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
2df00 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
2df10 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
2df20 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
2df30 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
2df40 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
2df50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2df60 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2df70 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
2df80 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
2df90 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2dfa0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2dfb0 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73  , pGroupBy, 0, s
2dfc0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29  AggInfo.nColumn)
2dfd0 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
2dfe0 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
2dff0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2e000 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
2e010 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2e020 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
2e030 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2e040 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
2e050 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
2e060 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2e070 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
2e080 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
2e090 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
2e0a0 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
2e0b0 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
2e0c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
2e0d0 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
2e0e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
2e0f0 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
2e100 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2e110 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
2e120 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2e130 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2e140 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2e150 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2e160 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
2e170 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2e180 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
2e190 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2e1a0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2e1b0 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
2e1c0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
2e1d0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2e1e0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2e1f0 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
2e200 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2e210 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2e220 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2e230 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
2e240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e250 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2e260 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
2e270 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2e280 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
2e290 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2e2a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e2b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2e2c0 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
2e2d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2e2e0 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
2e2f0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
2e300 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
2e310 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2e320 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
2e330 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
2e340 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
2e350 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
2e360 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
2e370 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
2e380 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
2e390 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
2e3a0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
2e3b0 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
2e3c0 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
2e3d0 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
2e3e0 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
2e3f0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
2e400 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
2e410 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
2e420 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
2e430 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
2e440 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
2e450 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
2e460 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e480 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2e490 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
2e4a0 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
2e4b0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2e4c0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2e4d0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2e4e0 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20  pGroupBy, 0,.   
2e4f0 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f         WHERE_GRO
2e500 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47  UPBY | (orderByG
2e510 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42  rp ? WHERE_SORTB
2e520 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20  YGROUP : 0), 0. 
2e530 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
2e540 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
2e550 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2e560 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2e570 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2e580 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79  WInfo)==pGroupBy
2e590 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2e5a0 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
2e5b0 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
2e5c0 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
2e5d0 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
2e5e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
2e5f0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
2e600 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
2e610 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
2e620 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
2e630 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
2e640 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
2e650 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
2e660 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
2e670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e680 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
2e690 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2e6a0 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
2e6b0 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
2e6c0 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
2e6d0 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
2e6e0 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
2e6f0 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
2e700 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
2e710 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
2e720 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
2e730 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
2e740 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
2e750 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
2e760 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
2e770 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
2e780 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
2e790 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
2e7a0 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
2e7b0 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
2e7c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
2e7d0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
2e7e0 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
2e7f0 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
2e800 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
2e810 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
2e820 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
2e830 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
2e840 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
2e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e860 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
2e870 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
2e880 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
2e890 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
2e8a0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2e8b0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2e8c0 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
2e8d0 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  y;.        j = n
2e8e0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2e8f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2e900 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
2e910 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2e920 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
2e930 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
2e940 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
2e950 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
2e960 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
2e970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e980 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
2e990 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
2e9a0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2e9b0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2e9c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2e9d0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2e9e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2e9f0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2ea00 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
2ea10 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
2ea20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2ea30 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
2ea40 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2ea50 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2ea60 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2ea70 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2ea80 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
2ea90 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
2eaa0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2eab0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2eac0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
2ead0 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
2eae0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2eaf0 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  r2;..           
2eb00 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
2eb10 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
2eb20 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
2eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb40 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2eb50 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
2eb60 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
2eb70 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
2eb80 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
2eb90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2eba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ebb0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
2ebc0 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
2ebd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ebe0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
2ebf0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2ec00 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
2ec10 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2ec20 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
2ec30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ec40 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
2ec50 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
2ec60 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
2ec70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ec80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ec90 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
2eca0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2ecb0 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
2ecc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ecd0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2ece0 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
2ecf0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2ed00 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2ed10 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
2ed20 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
2ed30 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2ed40 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2ed50 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2ed60 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73  rtingIdxPTab = s
2ed70 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65  ortPTab = pParse
2ed80 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2ed90 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69    sortOut = sqli
2eda0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2edb0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2edc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2edd0 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
2ede0 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72  o, sortPTab, sor
2edf0 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  tOut, nCol);.   
2ee00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ee10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2ee20 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  terSort, sAggInf
2ee30 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2ee40 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
2ee50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2ee60 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
2ee70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2ee80 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  v);.        sAgg
2ee90 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
2eea0 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
2eeb0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2eec0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a  Clear(pParse);..
2eed0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2eee0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f  * If the index o
2eef0 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
2ef00 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52  e used by the GR
2ef10 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20  OUP BY sort.    
2ef20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61    ** will natura
2ef30 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73  lly deliver rows
2ef40 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65   in the order re
2ef50 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
2ef60 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20  DER BY.      ** 
2ef70 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74  clause, cancel t
2ef80 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
2ef90 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61  le open coded ea
2efa0 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  rlier..      **.
2efb0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
2efc0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2efd0 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61   - the correct a
2efe0 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73  nswer should res
2eff0 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a  ult regardless..
2f000 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65        ** Use the
2f010 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2f020 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
2f030 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2f040 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20  PTIMIZER to .   
2f050 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
2f060 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
2f070 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
2f080 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  oses.  */.      
2f090 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26  if( orderByGrp &
2f0a0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2f0b0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2f0c0 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a  _GroupByOrder) .
2f0d0 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70         && (group
2f0e0 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65  BySort || sqlite
2f0f0 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70  3WhereIsSorted(p
2f100 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b  WInfo)).      ){
2f110 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
2f120 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2f130 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f140 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2f150 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2f160 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
2f170 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
2f180 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2f190 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
2f1a0 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
2f1b0 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
2f1c0 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
2f1d0 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
2f1e0 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
2f1f0 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
2f200 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
2f210 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
2f220 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
2f230 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
2f240 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
2f250 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
2f260 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
2f270 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
2f280 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
2f290 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
2f2a0 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
2f2b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f2c0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2f2d0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2f2e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
2f2f0 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2f300 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2f310 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f320 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41  P_SorterData, sA
2f330 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2f340 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
2f350 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72               sor
2f360 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b  tOut, sortPTab);
2f370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2f380 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
2f390 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
2f3a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
2f3b0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2f3c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f3d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
2f3e0 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20  lumn, sortPTab, 
2f3f0 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
2f400 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f410 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
2f420 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
2f430 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f440 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2f450 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
2f460 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
2f470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f480 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2f490 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2f4a0 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
2f4b0 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
2f4c0 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
2f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4e0 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
2f4f0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
2f500 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
2f510 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  O);.      j1 = s
2f520 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f530 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2f540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f550 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31  3(v, OP_Jump, j1
2f560 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56 64  +1, 0, j1+1); Vd
2f570 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
2f580 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2f590 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
2f5a0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
2f5b0 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
2f5c0 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
2f5d0 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
2f5e0 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
2f5f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
2f600 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
2f610 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
2f620 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
2f630 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
2f640 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
2f650 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
2f660 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
2f670 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
2f680 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
2f690 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
2f6a0 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
2f6b0 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
2f6c0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
2f6d0 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
2f6e0 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
2f6f0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
2f700 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
2f710 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
2f720 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
2f730 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
2f740 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2f750 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
2f760 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
2f770 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
2f780 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
2f790 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f7a0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2f7b0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2f7c0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2f7d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f7e0 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
2f7f0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2f800 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f810 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
2f820 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56  lag, addrEnd); V
2f830 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2f840 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2f850 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
2f860 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2f870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f880 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2f890 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
2f8a0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
2f8b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
2f8c0 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
2f8d0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
2f8e0 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
2f8f0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
2f900 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
2f910 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
2f920 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
2f930 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f940 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2f950 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
2f960 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
2f970 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2f980 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
2f990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f9a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
2f9b0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
2f9c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2f9d0 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
2f9e0 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
2f9f0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
2fa00 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
2fa10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2fa20 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2fa30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fa40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fa50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
2fa60 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2fa70 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
2fa80 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2fa90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2faa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fab0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2fac0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
2fad0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2fae0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
2faf0 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
2fb00 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
2fb10 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
2fb20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
2fb30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2fb40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2fb50 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2fb60 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2fb70 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2fb80 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2fb90 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
2fba0 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
2fbb0 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
2fbc0 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
2fbd0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2fbe0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fbf0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e  _Goto, 0, addrEn
2fc00 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
2fc10 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2fc20 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
2fc30 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2fc40 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2fc50 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
2fc60 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
2fc70 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
2fc80 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
2fc90 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
2fca0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2fcb0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
2fcc0 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
2fcd0 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
2fce0 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
2fcf0 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
2fd00 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
2fd10 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
2fd20 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
2fd30 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
2fd40 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
2fd50 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
2fd60 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
2fd70 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
2fd80 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
2fd90 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
2fda0 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
2fdb0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
2fdc0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2fdd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fde0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2fdf0 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
2fe00 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2fe10 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
2fe20 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
2fe30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fe40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
2fe50 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
2fe60 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
2fe70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2fe80 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
2fe90 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
2fea0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2feb0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2fec0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2fed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fee0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
2fef0 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
2ff00 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
2ff10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2ff20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2ff30 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
2ff40 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
2ff50 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
2ff60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ff70 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2ff80 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2ff90 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
2ffa0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
2ffb0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2ffc0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2ffd0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
2ffe0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
2fff0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
30000 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
30010 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
30020 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
30030 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
30040 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20  1, &sSort,.     
30050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30060 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
30070 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
30080 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
30090 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
300a0 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
300b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
300c0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
300d0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
300e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
300f0 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
30100 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
30110 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
30120 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
30130 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
30140 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
30150 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
30160 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
30170 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
30180 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
30190 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
301a0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
301b0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
301c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
301d0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
301e0 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
301f0 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
30200 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
30210 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
30220 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
30230 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
30240 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
30250 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
30260 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
30270 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
30280 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
30290 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
302a0 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
302b0 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
302c0 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
302d0 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
302e0 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
302f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
30300 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
30310 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
30320 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
30330 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
30340 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
30350 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
30360 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
30370 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
30380 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
30390 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
303a0 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
303b0 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
303c0 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
303d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
303e0 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
303f0 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
30400 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
30410 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
30420 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
30430 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
30440 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
30450 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
30460 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
30470 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
30480 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
30490 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
304a0 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
304b0 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
304c0 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
304d0 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
304e0 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
304f0 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
30500 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
30510 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
30520 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
30530 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
30540 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
30550 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
30560 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
30570 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
30580 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
30590 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
305a0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
305b0 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
305c0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
305d0 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
305e0 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
305f0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
30600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30610 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
30620 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
30630 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
30640 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
30650 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
30660 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
30670 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
30680 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
30690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
306a0 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
306b0 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
306c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
306d0 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
306e0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
306f0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
30700 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
30710 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
30720 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
30730 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
30740 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30750 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
30760 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
30770 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
30780 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
30790 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
307a0 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
307b0 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f  e lowest scan co
307c0 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st..        **. 
307d0 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d         ** (2011-
307e0 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f  04-15) Do not do
307f0 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20   a full scan of 
30800 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64  an unordered ind
30810 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
30820 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d         ** (2013-
30830 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f  10-03) Do not co
30840 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20  unt the entries 
30850 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  in a partial ind
30860 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
30870 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61         ** In pra
30880 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66  ctice the KeyInf
30890 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c  o structure will
308a0 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74   not be used. It
308b0 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20   is only .      
308c0 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b    ** passed to k
308d0 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  eep OP_OpenRead 
308e0 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a  happy..        *
308f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48  /.        if( !H
30900 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
30910 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pBest = sqlite3P
30920 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
30930 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  Tab);.        fo
30940 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
30950 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
30960 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
30970 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
30980 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
30990 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
309a0 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  dx->szIdxRow<pTa
309b0 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20  b->szTabRow.    
309c0 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
309d0 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
309e0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
309f0 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e  !pBest || pIdx->
30a00 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e  szIdxRow<pBest->
30a10 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20  szIdxRow).      
30a20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
30a30 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
30a40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
30a60 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
30a70 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42        iRoot = pB
30a80 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  est->tnum;.     
30a90 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
30aa0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
30ab0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42  Index(pParse, pB
30ac0 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
30ad0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
30ae0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
30af0 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
30b00 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
30b10 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
30b20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30b30 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
30b40 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
30b50 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31  r, iRoot, iDb, 1
30b60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
30b70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
30b80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30b90 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
30ba0 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
30bb0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
30bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30bd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30be0 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
30bf0 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61  iCsr, sAggInfo.a
30c00 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20  Func[0].iMem);. 
30c10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30c20 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
30c30 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20  lose, iCsr);.   
30c40 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70       explainSimp
30c50 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20  leCount(pParse, 
30c60 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20  pTab, pBest);.  
30c70 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
30c80 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
30c90 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
30ca0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
30cb0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75   Check if the qu
30cc0 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ery is of one of
30cd0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
30ce0 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  orms:.        **
30cf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
30d00 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d  LECT min(x) FROM
30d10 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20   ....        ** 
30d20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20    SELECT max(x) 
30d30 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
30d40 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
30d50 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73  f it is, then as
30d60 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68  k the code in wh
30d70 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74  ere.c to attempt
30d80 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73   to sort results
30d90 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69  .        ** as i
30da0 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22  f there was an "
30db0 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22  ORDER ON x" or "
30dc0 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22  ORDER ON x DESC"
30dd0 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20   clause. .      
30de0 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20    ** If where.c 
30df0 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75  is able to produ
30e00 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65  ce results sorte
30e10 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c  d in this order,
30e20 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
30e30 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74   add vdbe code t
30e40 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
30e50 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  he processing lo
30e60 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20  op after the .  
30e70 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69        ** first i
30e80 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20  teration (since 
30e90 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
30ea0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
30eb0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  is .        ** g
30ec0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65  uaranteed to ope
30ed0 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20  rate on the row 
30ee0 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d  with the minimum
30ef0 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20   or maximum .   
30f00 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
30f10 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77   x, the only row
30f20 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20   required)..    
30f30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
30f40 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67  * A special flag
30f50 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
30f60 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
30f70 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74  egin() to slight
30f80 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ly.        ** mo
30f90 64 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73  dify behavior as
30fa0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
30fb0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
30fc0 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79    + If the query
30fd0 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69   is a "SELECT mi
30fe0 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20  n(x)", then the 
30ff0 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20  loop coded by.  
31000 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65        **     whe
31010 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20  re.c should not 
31020 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79  iterate over any
31030 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e   values with a N
31040 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ULL value.      
31050 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a    **     for x..
31060 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31070 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70     **   + The op
31080 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20  timizer code in 
31090 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69  where.c (the thi
310a0 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20  ng that decides 
310b0 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
310c0 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e       index or in
310d0 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68  dices to use) sh
310e0 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66  ould place a dif
310f0 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20  ferent priority 
31100 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  on .        **  
31110 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68     satisfying th
31120 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61  e 'ORDER BY' cla
31130 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73  use than it does
31140 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e   in other cases.
31150 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
31160 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e  Refer to code an
31170 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68  d comments in wh
31180 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c  ere.c for detail
31190 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
311a0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
311b0 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20  pMinMax = 0;.   
311c0 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57       u8 flag = W
311d0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
311e0 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  MAL;.        .  
311f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
31200 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
31210 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31220 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flag==0 );.     
31230 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e     if( p->pHavin
31240 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
31250 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51    flag = minMaxQ
31260 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20  uery(&sAggInfo, 
31270 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20  &pMinMax);.     
31280 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
31290 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20  ert( flag==0 || 
312a0 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70  (pMinMax!=0 && p
312b0 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
312c0 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ) );..        if
312d0 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
312e0 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71      pMinMax = sq
312f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
31300 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29  (db, pMinMax, 0)
31310 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  ;.          pDel
31320 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20   = pMinMax;.    
31330 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61        if( pMinMa
31340 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
31350 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
31360 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
31370 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
31380 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
31390 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20  RBY_MIN ?1:0;.  
313a0 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
313b0 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  x->a[0].pExpr->o
313c0 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
313d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
313e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
313f0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
31400 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
31410 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
31420 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
31430 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
31440 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
31450 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
31460 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
31470 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a  le row.        *
31480 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
31490 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
314a0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
314b0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
314c0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49  fo);.        pWI
314d0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
314e0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
314f0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
31500 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67  , pMinMax,0,flag
31510 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
31520 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20   pWInfo==0 ){.  
31530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
31540 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
31550 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pDel);.       
31560 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
31570 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
31580 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
31590 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
315a0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
315b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e      assert( pMin
315c0 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61  Max==0 || pMinMa
315d0 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  x->nExpr==1 );. 
315e0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
315f0 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
31600 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20  (pWInfo)>0 ){.  
31610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
31620 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
31630 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33  Goto, 0, sqlite3
31640 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
31650 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  pWInfo));.      
31660 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
31670 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
31680 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
31690 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52       (flag==WHER
316a0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
316b0 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
316c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
316d0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
316e0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
316f0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
31700 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
31710 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
31720 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  }..      sSort.p
31730 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
31740 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
31750 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
31760 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
31770 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
31780 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
31790 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
317a0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
317b0 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  -1, 0, 0, .     
317c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317d0 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c   pDest, addrEnd,
317e0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
317f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
31800 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
31810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
31820 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
31830 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
31840 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
31850 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
31860 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69  ry */..  if( sDi
31870 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
31880 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
31890 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20  _UNORDERED ){.  
318a0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
318b0 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  le(pParse, "DIST
318c0 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  INCT");.  }..  /
318d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
318e0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
318f0 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
31900 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
31910 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
31920 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
31930 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
31940 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f  ..  */.  if( sSo
31950 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
31960 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
31970 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ble(pParse,.    
31980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31990 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20   sSort.nOBSat>0 
319a0 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f 46  ? "RIGHT PART OF
319b0 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45   ORDER BY":"ORDE
319c0 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65  R BY");.    gene
319d0 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
319e0 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20  rse, p, &sSort, 
319f0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
31a00 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
31a10 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
31a20 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
31a30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
31a40 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
31a50 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
31a60 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
31a70 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65 72 65   coded. If there
31a80 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20   is an error in 
31a90 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
31aa0 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68  ure,.  ** set th
31ab0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
31ac0 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e   1. Otherwise 0.
31ad0 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50 61 72   */.  rc = (pPar
31ae0 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20  se->nErr>0);..  
31af0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
31b00 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
31b10 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
31b20 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
31b30 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
31b40 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
31b50 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
31b60 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c  lect_end:.  expl
31b70 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
31b80 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
31b90 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
31ba0 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  d);..  /* Identi
31bb0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
31bc0 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  if results of th
31bd0 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20  e SELECT are to 
31be0 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
31bf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31c00 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44  _OK && pDest->eD
31c10 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
31c20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
31c30 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
31c40 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
31c50 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ist);.  }..  sql
31c60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
31c70 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
31c80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
31c90 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  b, sAggInfo.aFun
31ca0 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  c);.#if SELECTTR
31cb0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45  ACE_ENABLED.  SE
31cc0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
31cd0 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65  se,p,("end proce
31ce0 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50  ssing\n"));.  pP
31cf0 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
31d00 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20  ent--;.#endif.  
31d10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.