/ Hex Artifact Content
Login

Artifact 4c58ae319df6862e5ea237e757b5d317c4491798:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 75 38 20 73 6f 72 74  ral */.  u8 sort
07c0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f  Flags;         /
07d0: 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53  * Zero or more S
07e0: 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74 73 20 2a  ORTFLAG_* bits *
07f0: 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f 52  /.};.#define SOR
0800: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
0810: 20 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20 53   0x01   /* Use S
0820: 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65 61  orterOpen instea
0830: 64 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65 72  d of OpenEphemer
0840: 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  al */../*.** Del
0850: 65 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 74  ete all the cont
0860: 65 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74 20  ent of a Select 
0870: 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 61 6c  structure.  Deal
0880: 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75 63  locate the struc
0890: 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 6f  ture.** itself o
08a0: 6e 6c 79 20 69 66 20 62 46 72 65 65 20 69 73 20  nly if bFree is 
08b0: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
08c0: 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74  void clearSelect
08d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
08e0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46 72  lect *p, int bFr
08f0: 65 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  ee){.  while( p 
0900: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
0910: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
0920: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  r;.    sqlite3Ex
0930: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0940: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
0950: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0960: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72  elete(db, p->pSr
0970: 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  c);.    sqlite3E
0980: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0990: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
09a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
09b0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ete(db, p->pGrou
09c0: 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
09d0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
09e0: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
09f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0a00: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
0a10: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
0a20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0a30: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
0a40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a50: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
0a60: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
0a70: 33 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20  3WithDelete(db, 
0a80: 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69  p->pWith);.    i
0a90: 66 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74  f( bFree ) sqlit
0aa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
0ab0: 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b  .    p = pPrior;
0ac0: 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a  .    bFree = 1;.
0ad0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
0ae0: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0af0: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0b00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0b10: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0b20: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0b30: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0b40: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
0b50: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
0b60: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
0b70: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
0b80: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
0b90: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
0ba0: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0bb0: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0bc0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0bd0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0be0: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0bf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0c00: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0c10: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0c20: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0c30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0c40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0c50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0c60: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0c70: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0c80: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0c90: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0ca0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0cb0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0cc0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0cd0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0ce0: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0cf0: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0d00: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0d10: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0d20: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0d30: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0d40: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0d50: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0d60: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0d70: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0d80: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0d90: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0da0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
0db0: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0dc0: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0dd0: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0de0: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0df0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0e00: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0e10: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0e20: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0e30: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0e40: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0e50: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0e60: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0e70: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0e80: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0e90: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
0ea0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0eb0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0ec0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0ed0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0ee0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0ef0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
0f00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f10: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  );.    pNew = &s
0f20: 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73  tandin;.    mems
0f30: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
0f40: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a  of(*pNew));.  }.
0f50: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
0f60: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
0f70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
0f80: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0f90: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0fa0: 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a  TK_ALL,0));.  }.
0fb0: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
0fc0: 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70   pEList;.  if( p
0fd0: 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20  Src==0 ) pSrc = 
0fe0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0ff0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
1000: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
1010: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
1020: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
1030: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
1040: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
1050: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
1060: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1070: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1080: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1090: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
10a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
10b0: 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
10c0: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
10d0: 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d   pLimit;.  pNew-
10e0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
10f0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  et;.  assert( pO
1100: 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d  ffset==0 || pLim
1110: 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  it!=0 || pParse-
1120: 3e 6e 45 72 72 3e 30 20 7c 7c 20 64 62 2d 3e 6d  >nErr>0 || db->m
1130: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
1140: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1150: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
1160: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
1170: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
1180: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1190: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65  iled ) {.    cle
11a0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
11b0: 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  w, pNew!=&standi
11c0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  n);.    pNew = 0
11d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
11e0: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
11f0: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
1200: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
1210: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
1220: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
1230: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20  rn pNew;.}..#if 
1240: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1250: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  LED./*.** Set th
1260: 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65  e name of a Sele
1270: 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ct object.*/.voi
1280: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53  d sqlite3SelectS
1290: 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70  etName(Select *p
12a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
12b0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ame){.  if( p &&
12c0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
12d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
12e0: 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d  izeof(p->zSelNam
12f0: 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), p->zSelName,
1300: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%s", zName);. 
1310: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1320: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
1330: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
1340: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
1350: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1360: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1370: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1380: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
1390: 65 63 74 20 2a 70 29 7b 0a 20 20 63 6c 65 61 72  ect *p){.  clear
13a0: 53 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29  Select(db, p, 1)
13b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
13c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
13d0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
13e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
13f0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f  n a compound..*/
1400: 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
1410: 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65  findRightmost(Se
1420: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c  lect *p){.  whil
1430: 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20  e( p->pNext ) p 
1440: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  = p->pNext;.  re
1450: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1460: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
1470: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64  entifiers preced
1480: 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79  ing the JOIN key
1490: 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20  word, determine 
14a0: 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a  the.** type of j
14b0: 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  oin.  Return an 
14c0: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
14d0: 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20   that expresses 
14e0: 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20  that type.** in 
14f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c  terms of the fol
1500: 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65  lowing bit value
1510: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f  s:.**.**     JT_
1520: 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  INNER.**     JT_
1530: 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f  CROSS.**     JT_
1540: 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  OUTER.**     JT_
1550: 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a  NATURAL.**     J
1560: 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54  T_LEFT.**     JT
1570: 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66  _RIGHT.**.** A f
1580: 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69  ull outer join i
1590: 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  s the combinatio
15a0: 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64  n of JT_LEFT and
15b0: 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a   JT_RIGHT..**.**
15c0: 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f   If an illegal o
15d0: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
15e0: 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c  in type is seen,
15f0: 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
1600: 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70  rn.** a join typ
1610: 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72  e, but put an er
1620: 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73  ror in the pPars
1630: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1640: 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54  int sqlite3JoinT
1650: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
1660: 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f  e, Token *pA, To
1670: 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a  ken *pB, Token *
1680: 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74  pC){.  int joint
1690: 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e  ype = 0;.  Token
16a0: 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f   *apAll[3];.  To
16b0: 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  ken *p;.        
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35       /*   012345
16e0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
16f0: 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a  23456789 123 */.
1700: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1710: 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d  har zKeyText[] =
1720: 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65   "naturaleftoute
1730: 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72  rightfullinnercr
1740: 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63  oss";.  static c
1750: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
1760: 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f    u8 i;        /
1770: 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b  * Beginning of k
1780: 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a  eyword text in z
1790: 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20  KeyText[] */.   
17a0: 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a   u8 nChar;    /*
17b0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b   Length of the k
17c0: 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63  eyword in charac
17d0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63  ters */.    u8 c
17e0: 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e  ode;     /* Join
17f0: 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20   type mask */.  
1800: 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b  } aKeyword[] = {
1810: 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20  .    /* natural 
1820: 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e  */ { 0,  7, JT_N
1830: 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20  ATURAL          
1840: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1850: 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20  left    */ { 6, 
1860: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
1870: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c  UTER          },
1880: 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20  .    /* outer   
1890: 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f  */ { 10, 5, JT_O
18a0: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20  UTER            
18b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
18c0: 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c  right   */ { 14,
18d0: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
18e0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c  OUTER         },
18f0: 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20  .    /* full    
1900: 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c  */ { 19, 4, JT_L
1910: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
1920: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20  OUTER },.    /* 
1930: 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c  inner   */ { 23,
1940: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20   5, JT_INNER    
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1960: 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20  .    /* cross   
1970: 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49  */ { 28, 5, JT_I
1980: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20  NNER|JT_CROSS   
1990: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
19a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
19b0: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
19c0: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
19d0: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
19e0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
19f0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
1a00: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
1a10: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1a20: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1a30: 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rd); j++){.     
1a40: 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77   if( p->n==aKeyw
1a50: 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20  ord[j].nChar .  
1a60: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
1a70: 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
1a80: 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78  *)p->z, &zKeyTex
1a90: 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d  t[aKeyword[j].i]
1aa0: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
1ab0: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1ac0: 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f  = aKeyword[j].co
1ad0: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
1ae0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1af0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a  .    testcase( j
1b00: 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a  ==0 || j==1 || j
1b10: 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a  ==2 || j==3 || j
1b20: 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a  ==4 || j==5 || j
1b30: 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ==6 );.    if( j
1b40: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  >=ArraySize(aKey
1b50: 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a  word) ){.      j
1b60: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
1b70: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1b80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1b90: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
1ba0: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
1bb0: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
1bc0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
1bd0: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1be0: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
1bf0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1c00: 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20  r *zSp = " ";.  
1c10: 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20    assert( pB!=0 
1c20: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30  );.    if( pC==0
1c30: 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20   ){ zSp++; }.   
1c40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c50: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
1c60: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
1c70: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20   join type: ".  
1c80: 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22       "%T %T%s%T"
1c90: 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70  , pA, pB, zSp, p
1ca0: 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  C);.    jointype
1cb0: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1cc0: 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79  else if( (jointy
1cd0: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1ce0: 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0 .         && (
1cf0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
1d00: 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d  EFT|JT_RIGHT))!=
1d10: 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73  JT_LEFT ){.    s
1d20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d30: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
1d40: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
1d50: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
1d60: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
1d70: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
1d80: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1d90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
1da0: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
1db0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1dc0: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
1dd0: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
1de0: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
1df0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
1e00: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
1e10: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1e20: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
1e30: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
1e40: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
1e50: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1e60: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
1e70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1e80: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1e90: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
1ea0: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
1eb0: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1ec0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1ed0: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69  ** Search the fi
1ee0: 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20  rst N tables in 
1ef0: 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20  pSrc, from left 
1f00: 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e  to right, lookin
1f10: 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  g for a.** table
1f20: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75   that has a colu
1f30: 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20  mn named zCol.  
1f40: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e  .**.** When foun
1f50: 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e  d, set *piTab an
1f60: 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20  d *piCol to the 
1f70: 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20  table index and 
1f80: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20  column index.** 
1f90: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
1fa0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72  column and retur
1fb0: 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  n TRUE..**.** If
1fc0: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75   not found, retu
1fd0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
1fe0: 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64  tic int tableAnd
1ff0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53  ColumnIndex(.  S
2000: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
2010: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2020: 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68  tables to search
2030: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
2040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2050: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2060: 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73  n pSrc->a[] to s
2070: 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  earch */.  const
2080: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
2090: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
20a0: 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f  olumn we are loo
20b0: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  king for */.  in
20c0: 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20  t *piTab,       
20d0: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
20e0: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68  x of pSrc->a[] h
20f0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ere */.  int *pi
2100: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Col           /*
2110: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
2120: 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e  pSrc->a[*piTab].
2130: 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72  pTab->aCol[] her
2140: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2160: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2170: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  er tables in pSr
2180: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  c */.  int iCol;
2190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21a0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d  ndex of column m
21b0: 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a  atching zCol */.
21c0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61  .  assert( (piTa
21d0: 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30  b==0)==(piCol==0
21e0: 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72  ) );  /* Both or
21f0: 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c   neither are NUL
2200: 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  L */.  for(i=0; 
2210: 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<N; i++){.    i
2220: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
2230: 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  x(pSrc->a[i].pTa
2240: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b, zCol);.    if
2250: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
2260: 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a     if( piTab ){.
2270: 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d          *piTab =
2280: 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43   i;.        *piC
2290: 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
22a0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
22b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
22c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
22d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
22e0: 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74  is used to add t
22f0: 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20  erms implied by 
2300: 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74  JOIN syntax to t
2310: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
2320: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  se expression of
2330: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2340: 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72  ent. The new ter
2350: 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41  m, which.** is A
2360: 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78  NDed with the ex
2370: 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61  isting WHERE cla
2380: 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66  use, is of the f
2390: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74  orm:.**.**    (t
23a0: 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e  ab1.col1 = tab2.
23b0: 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72  col2).**.** wher
23c0: 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53  e tab1 is the iS
23d0: 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53  rc'th table in S
23e0: 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20  rcList pSrc and 
23f0: 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20  tab2 is the .** 
2400: 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c  (iSrc+1)'th. Col
2410: 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75  umn col1 is colu
2420: 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74  mn iColLeft of t
2430: 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73  ab1, and col2 is
2440: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52  .** column iColR
2450: 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f  ight of tab2..*/
2460: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
2470: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72  WhereTerm(.  Par
2480: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24b0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
24c0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rc,             
24d0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
24e0: 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63  tables in FROM c
24f0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
2500: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2520: 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62  dex of first tab
2530: 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53  le to join in pS
2540: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
2550: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2560: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2570: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69   of column in fi
2580: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  rst table */.  i
2590: 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20  nt iRight,      
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e  * Index of secon
25c0: 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20  d table in pSrc 
25d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67  */.  int iColRig
25e0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
25f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2600: 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e   column in secon
2610: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  d table */.  int
2620: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20   isOuterJoin,   
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2640: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2650: 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f  an OUTER join */
2660: 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2670: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2680: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68     /* IN/OUT: Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  o add to */.){. 
26b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
26c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
26d0: 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a  r *pE1;.  Expr *
26e0: 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71  pE2;.  Expr *pEq
26f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ;..  assert( iLe
2700: 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61  ft<iRight );.  a
2710: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72  ssert( pSrc->nSr
2720: 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  c>iRight );.  as
2730: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c  sert( pSrc->a[iL
2740: 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61  eft].pTab );.  a
2750: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
2760: 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a  Right].pTab );..
2770: 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43    pE1 = sqlite3C
2780: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2790: 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  db, pSrc, iLeft,
27a0: 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45   iColLeft);.  pE
27b0: 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  2 = sqlite3Creat
27c0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
27d0: 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43  pSrc, iRight, iC
27e0: 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71  olRight);..  pEq
27f0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2800: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
2810: 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69  E1, pE2, 0);.  i
2820: 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74 65  f( pEq && isOute
2830: 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70  rJoin ){.    Exp
2840: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 71  rSetProperty(pEq
2850: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2860: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2870: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 71  rHasProperty(pEq
2880: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2890: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
28a0: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
28b0: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52  erty(pEq, EP_NoR
28c0: 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45 71 2d  educe);.    pEq-
28d0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
28e0: 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61   = (i16)pE2->iTa
28f0: 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68  ble;.  }.  *ppWh
2900: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2910: 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72  rAnd(db, *ppWher
2920: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2930: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2940: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2950: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2960: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2970: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
2980: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
2990: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
29a0: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
29b0: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
29c0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
29d0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
29e0: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
29f0: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2a00: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2a10: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2a20: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2a30: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2a40: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2a50: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2a60: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2a70: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
2a80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
2a90: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
2aa0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
2ab0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
2ac0: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
2ad0: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2ae0: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2af0: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2b00: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2b10: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2b20: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2b30: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2b40: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2b50: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2b60: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2b70: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
2b80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
2b90: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
2ba0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
2bb0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
2bc0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
2bd0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
2be0: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
2bf0: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
2c00: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
2c10: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
2c20: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
2c30: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
2c40: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
2c50: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2c60: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
2c70: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
2c80: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
2c90: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
2ca0: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
2cb0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
2cc0: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
2cd0: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
2ce0: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
2cf0: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
2d00: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
2d10: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
2d20: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
2d30: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
2d40: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
2d50: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2d60: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
2d70: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
2d80: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
2d90: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
2da0: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
2db0: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
2dc0: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
2dd0: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
2de0: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
2df0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
2e00: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
2e10: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
2e20: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
2e30: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2e40: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2e50: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2e60: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
2e70: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2e80: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2e90: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2ea0: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
2eb0: 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  e);.    p->iRigh
2ec0: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
2ed0: 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  6)iTable;.    if
2ee0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
2ef0: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
2f00: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
2f10: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
2f20: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
2f30: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2f40: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
2f50: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
2f60: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
2f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f80: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
2f90: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
2fa0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2fb0: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2fc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2fd0: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2fe0: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2ff0: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
3000: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
3010: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3020: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
3030: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
3040: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3050: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
3060: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
3070: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
3080: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
3090: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
30a0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
30b0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
30c0: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
30d0: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
30e0: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
30f0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
3100: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
3110: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
3120: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
3130: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
3140: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
3150: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
3160: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
3170: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
3180: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
3190: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
31a0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
31b0: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
31c0: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
31d0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
31e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
31f0: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
3200: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
3210: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
3220: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3230: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
3240: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
3250: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
3260: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
3270: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
3280: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
3290: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
32a0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
32c0: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
32d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
32e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
3310: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
3320: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
3330: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
3340: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
3350: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
3360: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
3370: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
3380: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3390: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
33a0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
33b0: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
33c0: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
33d0: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
33e0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
33f0: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
3400: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
3410: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
3420: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
3430: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3440: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
3450: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
3460: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
3470: 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  ER(pLeftTab==0 |
3480: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20  | pRightTab==0) 
3490: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
34a0: 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68  isOuter = (pRigh
34b0: 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  t->fg.jointype &
34c0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
34d0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
34e0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
34f0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
3500: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
3510: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
3520: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
3530: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
3540: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
3550: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3560: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3570: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
3580: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
3590: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
35a0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
35b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
35c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
35d0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
35e0: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
35f0: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
3600: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
3610: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
3620: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
3630: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3640: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
3650: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
3660: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
3670: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
3680: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
3690: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
36a0: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
36b0: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
36c0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
36d0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
36e0: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
36f0: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
3700: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
3710: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
3720: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
3730: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
3740: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3750: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3760: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3770: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
3780: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3790: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
37a0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
37b0: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
37d0: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
37e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3800: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
3810: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
3820: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
3830: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
3840: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3850: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
3860: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
3870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3880: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3890: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
38a0: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
38b0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
38c0: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
38d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
38e0: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
38f0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
3900: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
3910: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
3920: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
3930: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
3940: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3950: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
3960: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
3970: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
3980: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3990: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
39a0: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
39b0: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
39c0: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
39d0: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
39e0: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
39f0: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
3a00: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
3a10: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
3a20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
3a30: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
3a40: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
3a50: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
3a60: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
3a70: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
3a80: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3a90: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3aa0: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3ab0: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3ac0: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3ad0: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3ae0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3af0: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
3b00: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
3b10: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
3b20: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
3b30: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
3b40: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
3b50: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3b60: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3b70: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3b80: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3b90: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3ba0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3bb0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3bc0: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3bd0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3be0: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3bf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3c00: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
3c10: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
3c20: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
3c30: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
3c40: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3c50: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3c60: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3c70: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3c80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c90: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3ca0: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3cb0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3cc0: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3cd0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3ce0: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3cf0: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
3d00: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
3d10: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
3d20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
3d30: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
3d40: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
3d50: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3d60: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3d70: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3d80: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3d90: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3da0: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3db0: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3dc0: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3dd0: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3de0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3df0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3e00: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
3e10: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
3e20: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
3e30: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
3e40: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
3e50: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3e60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3e80: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3e90: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3ea0: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3eb0: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3ee0: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3ef0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3f00: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
3f10: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3f20: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
3f30: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
3f40: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
3f50: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3f60: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3f70: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
3f80: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
3f90: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
3fa0: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
3fb0: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
3fc0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
3fd0: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
3fe0: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
3ff0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
4000: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
4010: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
4020: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
4030: 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a  he end */.);../*
4040: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
4050: 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  e that will push
4060: 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72   the record in r
4070: 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74 61  egisters regData
4080: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67 44  .** through regD
4090: 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f  ata+nData-1 onto
40a0: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
40b0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
40c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
40d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
40e0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
40f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
4100: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
4110: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
4120: 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  n about the ORDE
4130: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
4140: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
4150: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
4160: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
4170: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
4180: 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  egData,         
4190: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
41a0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
41b0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
41c0: 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44 61  .  int regOrigDa
41d0: 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  ta,       /* Fir
41e0: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
41f0: 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65 20  ing data before 
4200: 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  packing */.  int
4210: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
4220: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4230: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
4240: 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20   data array */. 
4250: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
4260: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4270: 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72  f reg prior to r
4280: 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65  egData available
4290: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20   for use */.){. 
42a0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
42b0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20    /* Stmt under 
42e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
42f0: 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70    int bSeq = ((p
4300: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
4310: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
4320: 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74  rter)==0);.  int
4330: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
4340: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4360: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
4370: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
4380: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
4390: 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20  bSeq + nData;   
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
43b0: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in sorter
43c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
43d0: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4400: 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72   Regs for sorter
4410: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
4420: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70   regRecord = ++p
4430: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4450: 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65   Assembled sorte
4460: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4470: 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74  t nOBSat = pSort
4480: 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  ->nOBSat;       
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
44a0: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
44b0: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e   to skip */.  in
44c0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64   /* Opcode to ad
44f0: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
4500: 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  to sorter */..  
4510: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
4520: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
4530: 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 31  assert( nData==1
4540: 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65 67   || regData==reg
4550: 4f 72 69 67 44 61 74 61 20 29 3b 0a 20 20 69 66  OrigData );.  if
4560: 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a  ( nPrefixReg ){.
4570: 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65      assert( nPre
4580: 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53  fixReg==nExpr+bS
4590: 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73  eq );.    regBas
45a0: 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45  e = regData - nE
45b0: 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65  xpr - bSeq;.  }e
45c0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65  lse{.    regBase
45d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
45e0: 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  + 1;.    pParse-
45f0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a  >nMem += nBase;.
4600: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
4610: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
4620: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4630: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20  derBy, regBase, 
4640: 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20  regOrigData,.   
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
4670: 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43  EL_DUP|SQLITE_EC
4680: 45 4c 5f 52 45 46 29 3b 0a 20 20 69 66 28 20 62  EL_REF);.  if( b
4690: 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Seq ){.    sqlit
46a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
46b0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f  OP_Sequence, pSo
46c0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
46d0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
46e0: 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  }.  if( nPrefixR
46f0: 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  eg==0 ){.    sql
4700: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
4710: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
4720: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
4730: 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20  bSeq, nData);.  
4740: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  }..  sqlite3Vdbe
4750: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
4760: 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
4770: 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e  +nOBSat, nBase-n
4780: 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64  OBSat, regRecord
4790: 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e  );.  if( nOBSat>
47a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  0 ){.    int reg
47b0: 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68  PrevKey;   /* Th
47c0: 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63  e first nOBSat c
47d0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72  olumns of the pr
47e0: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
47f0: 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b    int addrFirst;
4800: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4810: 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f  f the OP_IfNot o
4820: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74  pcode */.    int
4830: 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f   addrJmp;      /
4840: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
4850: 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20   OP_Jump opcode 
4860: 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  */.    VdbeOp *p
4870: 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f  Op;      /* Opco
4880: 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68  de that opens th
4890: 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
48a0: 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20  int nKey;       
48b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
48c0: 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d  orting key colum
48d0: 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50  ns, including OP
48e0: 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20  _Sequence */.   
48f0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20   KeyInfo *pKI;  
4900: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b     /* Original K
4910: 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f  eyInfo on the so
4920: 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  rter table */.. 
4930: 20 20 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20     regPrevKey = 
4940: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
4950: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
4960: 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61   += pSort->nOBSa
4970: 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45  t;.    nKey = nE
4980: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42  xpr - pSort->nOB
4990: 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20  Sat + bSeq;.    
49a0: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
49b0: 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71    addrFirst = sq
49c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
49d0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
49e0: 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20  Base+nExpr); .  
49f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
4a00: 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
4a10: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4a20: 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c  OP_SequenceTest,
4a30: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4a40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62  );.    }.    Vdb
4a50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4a70: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
4a80: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72  e, regPrevKey, r
4a90: 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e  egBase, pSort->n
4aa0: 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20  OBSat);.    pOp 
4ab0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
4ac0: 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64  Op(v, pSort->add
4ad0: 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
4ae0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
4af0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
4b00: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d  return;.    pOp-
4b10: 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61  >p2 = nKey + nDa
4b20: 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f  ta;.    pKI = pO
4b30: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
4b40: 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e      memset(pKI->
4b50: 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70  aSortOrder, 0, p
4b60: 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a 20  KI->nField); /* 
4b70: 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62 65  Makes OP_Jump be
4b80: 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a  low testable */.
4b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4ba0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
4bb0: 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45  char*)pKI, P4_KE
4bc0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73 74  YINFO);.    test
4bd0: 63 61 73 65 28 20 70 4b 49 2d 3e 6e 58 46 69 65  case( pKI->nXFie
4be0: 6c 64 3e 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d  ld>2 );.    pOp-
4bf0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  >p4.pKeyInfo = k
4c00: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
4c10: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4c20: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53  ->pOrderBy, nOBS
4c30: 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  at,.            
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
4c60: 4b 49 2d 3e 6e 58 46 69 65 6c 64 2d 31 29 3b 0a  KI->nXField-1);.
4c70: 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71      addrJmp = sq
4c80: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
4c90: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
4ca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4cb0: 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a  , OP_Jump, addrJ
4cc0: 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70  mp+1, 0, addrJmp
4cd0: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
4ce0: 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  e(v);.    pSort-
4cf0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71  >labelBkOut = sq
4d00: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
4d10: 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  el(v);.    pSort
4d20: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
4d30: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
4d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d50: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
4d60: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4d70: 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  n, pSort->labelB
4d80: 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  kOut);.    sqlit
4d90: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4da0: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
4db0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
4dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4dd0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
4de0: 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c  rFirst);.    sql
4df0: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
4e00: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
4e10: 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53  , regPrevKey, pS
4e20: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4e40: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70  pHere(v, addrJmp
4e50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
4e60: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
4e70: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
4e80: 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  er ){.    op = O
4e90: 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a  P_SorterInsert;.
4ea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
4eb0: 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
4ec0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
4ed0: 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70  eAddOp2(v, op, p
4ee0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20  Sort->iECursor, 
4ef0: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
4f00: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  ( pSelect->iLimi
4f10: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  t ){.    int add
4f20: 72 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  r;.    int iLimi
4f30: 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  t;.    if( pSele
4f40: 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20  ct->iOffset ){. 
4f50: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
4f60: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31  elect->iOffset+1
4f70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4f80: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
4f90: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ect->iLimit;.   
4fa0: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71   }.    addr = sq
4fb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4fc0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c  v, OP_IfNotZero,
4fd0: 20 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b 20   iLimit, 0, 1); 
4fe0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5000: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
5010: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
5020: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
5030: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5040: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
5050: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
5060: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5070: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d  re(v, addr);.  }
5080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
5090: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
50a0: 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74  the OFFSET.*/.st
50b0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66  atic void codeOf
50c0: 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  fset(.  Vdbe *v,
50d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
50e0: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
50f0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
5100: 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f   iOffset,      /
5110: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
5120: 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f  ng the offset co
5130: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5140: 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20  Continue     /* 
5150: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
5160: 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  p the current re
5170: 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  cord */.){.  if(
5180: 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20   iOffset>0 ){.  
5190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
51a0: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
51b0: 20 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69   iOffset, iConti
51c0: 6e 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76  nue, 1); VdbeCov
51d0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
51e0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
51f0: 46 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a  FFSET"));.  }.}.
5200: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5210: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
5220: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
5230: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
5240: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
5250: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
5260: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
5270: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
5280: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
5290: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
52a0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
52b0: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
52c0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
52d0: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
52e0: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
52f0: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
5300: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
5310: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
5320: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
5330: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
5340: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
5350: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
5360: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
5370: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
5380: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
5390: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
53a0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
53b0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
53c0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
53d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
53e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
53f0: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
5400: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
5410: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
5420: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
5430: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
5440: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
5450: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
5460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5470: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
5480: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
5490: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
54a0: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
54b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
54c0: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
54d0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
54e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
54f0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
5500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5510: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
5520: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
5530: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62  t, iMem, N); Vdb
5540: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5560: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5570: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
5580: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5590: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
55a0: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29  nsert, iTab, r1)
55b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
55c0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
55d0: 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  , r1);.}..#ifnde
55e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
55f0: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
5600: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
5610: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
5620: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
5630: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
5640: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
5650: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
5660: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
5670: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
5680: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
5690: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
56a0: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
56b0: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
56c0: 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f   error used to o
56d0: 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69  ccur.** in multi
56e0: 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68  ple places.  (Th
56f0: 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63  e error only occ
5700: 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65  urs in one place
5710: 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20   now, but we.** 
5720: 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f  retain the subro
5730: 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a  utine to minimiz
5740: 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f  e code disruptio
5750: 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  n.).*/.static in
5760: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
5770: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
5780: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5790: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
57a0: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
57b0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
57c0: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
57d0: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
57e0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
57f0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
5800: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
5810: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
5820: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
5830: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
5840: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
5850: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
5860: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
5870: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
5880: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
5890: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
58a0: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
58b0: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
58c0: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
58d0: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
58e0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
58f0: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
5900: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5910: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5920: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
5930: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5940: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
5950: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
5960: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
5970: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
5980: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
5990: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
59a0: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
59b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
59c0: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
59d0: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
59e0: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
59f0: 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20  row.  If srcTab 
5a00: 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  is.** zero or mo
5a10: 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73  re, then data is
5a20: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
5a30: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
5a40: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
5a50: 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f  to get number co
5a60: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61  lumns and the da
5a70: 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20  tatype for each 
5a80: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
5a90: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
5aa0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
5ab0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5ac0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5ad0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
5ae0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
5af0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5b00: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
5b10: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
5b20: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
5b30: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
5b40: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
5b50: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
5b60: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
5b70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5b80: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
5b90: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
5ba0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
5bb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
5bc0: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
5bd0: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f  how to process O
5be0: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73  RDER BY */.  Dis
5bf0: 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69  tinctCtx *pDisti
5c00: 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  nct, /* If not N
5c10: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
5c20: 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54   to process DIST
5c30: 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74  INCT */.  Select
5c40: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
5c50: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
5c60: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
5c70: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
5c80: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
5c90: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
5ca0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
5cb0: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
5cc0: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
5cd0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5ce0: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
5cf0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5d00: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5d10: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5d20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5d30: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
5d40: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5d50: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
5d60: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
5d70: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
5d80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5d90: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
5da0: 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  ry holding resul
5db0: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65  t set */.  int e
5dc0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
5dd0: 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f  est;   /* How to
5de0: 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75   dispose of resu
5df0: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
5e00: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
5e10: 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72  arm; /* First ar
5e20: 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73  gument to dispos
5e30: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
5e40: 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20  nt nResultCol;  
5e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5e60: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
5e70: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
5e80: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20  nPrefixReg = 0; 
5e90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5ea0: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
5eb0: 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52  ters before regR
5ec0: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esult */..  asse
5ed0: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
5ee0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
5ef0: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
5f00: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
5f10: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
5f20: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
5f30: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
5f40: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
5f50: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
5f60: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
5f70: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
5f80: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
5f90: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
5fa0: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
5fb0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
5fc0: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
5fd0: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
5fe0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
5ff0: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
6000: 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ultCol = pEList-
6010: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
6020: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
6030: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
6040: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
6050: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
6060: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
6070: 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d      if( !(pSort-
6080: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
6090: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
60a0: 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b   ) nPrefixReg++;
60b0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
60c0: 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65  Mem += nPrefixRe
60d0: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65  g;.    }.    pDe
60e0: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
60f0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6100: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6110: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
6120: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
6130: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
6140: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
6150: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
6160: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
6170: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
6180: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
6190: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
61a0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
61b0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
61c0: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
61d0: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
61e0: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
61f0: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
6200: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
6210: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
6220: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
6230: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
6240: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
6250: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
6260: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
6270: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
6280: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
6290: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
62a0: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
62b0: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
62c0: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
62d0: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
62e0: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
62f0: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
6300: 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74  Col;.  regResult
6310: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
6320: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
6330: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6340: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6350: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6360: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6370: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
6380: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
6390: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
63a0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
63b0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
63c0: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
63d0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
63e0: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
63f0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6400: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
6410: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
6420: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
6430: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
6440: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
6450: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
6460: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
6470: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a    u8 ecelFlags;.
6480: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
6490: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
64a0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
64b0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
64c0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65  ine ){.      ece
64d0: 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  lFlags = SQLITE_
64e0: 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65  ECEL_DUP;.    }e
64f0: 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46  lse{.      ecelF
6500: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lags = 0;.    }.
6510: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6520: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
6530: 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52  se, pEList, regR
6540: 65 73 75 6c 74 2c 20 30 2c 20 65 63 65 6c 46 6c  esult, 0, ecelFl
6550: 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
6560: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
6570: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
6580: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
6590: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
65a0: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
65b0: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
65c0: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
65d0: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
65e0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
65f0: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
6600: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
6610: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69  .    switch( pDi
6620: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
6630: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
6640: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
6650: 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
6660: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
6670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
6680: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20  longer required 
6690: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
66a0: 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  str. */.        
66b0: 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20  int iJump;      
66c0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
66d0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
66e0: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72         int regPr
66f0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
6700: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63  * Previous row c
6710: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  ontent */..     
6720: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
6730: 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65  pace for the pre
6740: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
6750: 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70       regPrev = p
6760: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
6770: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
6780: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6790: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l;..        /* C
67a0: 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
67b0: 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64  nEphemeral coded
67c0: 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f   earlier to an O
67d0: 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a  P_Null.        *
67e0: 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43  * sets the MEM_C
67f0: 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68  leared bit on th
6800: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
6810: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
6820: 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ** previous valu
6830: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
6840: 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65  use the OP_Ne be
6850: 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20  low to always.  
6860: 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e        ** fail on
6870: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
6880: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
6890: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72   even if the fir
68a0: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  st.        ** ro
68b0: 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a  w is all NULLs..
68c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
68d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
68e0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
68f0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
6900: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20  t);.        pOp 
6910: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
6920: 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  Op(v, pDistinct-
6930: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
6940: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
6950: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
6960: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
6970: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
6980: 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20  = regPrev;..    
6990: 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69      iJump = sqli
69a0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
69b0: 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43  dr(v) + nResultC
69c0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ol;.        for(
69d0: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
69e0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
69f0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
6a00: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
6a10: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
6a20: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6a30: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
6a40: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
6a50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6a60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a70: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
6a80: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
6a90: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
6aa0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
6ab0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
6ac0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6ae0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
6af0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
6b00: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
6b10: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
6b20: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
6b30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
6b40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6b50: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
6b60: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
6b70: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
6b80: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
6b90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6ba0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
6bb0: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
6bc0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
6bd0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
6be0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
6bf0: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
6c00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6c10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6c20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6c30: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
6c40: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
6c50: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
6c60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6c70: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
6c80: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
6c90: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
6ca0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6cb0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
6cc0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
6cd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6ce0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
6cf0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
6d00: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
6d10: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
6d20: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
6d30: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
6d40: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
6d50: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
6d60: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
6d70: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
6d80: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
6d90: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
6da0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
6db0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
6dc0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
6dd0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
6de0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
6df0: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
6e00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
6e10: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
6e20: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
6e30: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
6e40: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
6e50: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
6e60: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
6e70: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
6e80: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
6e90: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6ea0: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
6eb0: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
6ec0: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
6ed0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
6ee0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6ef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6f00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6f10: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
6f20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
6f30: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
6f40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6f50: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
6f60: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
6f70: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6f80: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6f90: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
6fa0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6fb0: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
6fc0: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
6fd0: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
6fe0: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
6ff0: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
7000: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
7010: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
7020: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
7030: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
7040: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
7050: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7060: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
7070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7080: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  Op3(v, OP_IdxDel
7090: 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ete, iParm, regR
70a0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
70b0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
70c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
70d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
70e0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
70f0: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
7100: 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
7110: 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
7120: 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
7130: 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20  case SRT_Fifo:. 
7140: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
7150: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
7160: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
7170: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
7180: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
7190: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
71a0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50  Range(pParse, nP
71b0: 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20  refixReg+1);.   
71c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
71d0: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
71e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
71f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
7200: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74 65  mTab );.      te
7210: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7220: 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20 20  RT_Fifo );.     
7230: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7240: 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  ==SRT_DistFifo )
7250: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7260: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7270: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
7280: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7290: 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  l, r1+nPrefixReg
72a0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
72b0: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20  E_OMIT_CTE.     
72c0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
72d0: 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20  DistFifo ){.    
72e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
72f0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
7300: 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73  tFifo, then curs
7310: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
7320: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
7330: 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  on an ephemeral 
7340: 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75  index. If the cu
7350: 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72  rrent row is alr
7360: 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20  eady present.   
7370: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
7380: 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69  ndex, do not wri
7390: 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74  te it to the out
73a0: 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64  put. If not, add
73b0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
73c0: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74  current row to t
73d0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f  he index and pro
73e0: 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e  ceed with writin
73f0: 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20  g it to the.    
7400: 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61      ** output ta
7410: 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f  ble as well.  */
7420: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
7430: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
7440: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
7450: 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  4;.        sqlit
7460: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
7470: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
7480: 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20  rm+1, addr, r1, 
7490: 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
74a0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
74b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
74c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
74d0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c  Insert, iParm+1,
74e0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73   r1);.        as
74f0: 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29  sert( pSort==0 )
7500: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
7510: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7520: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7530: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7540: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b  e, pSort, p, r1+
7550: 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67 52 65  nPrefixReg,regRe
7560: 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52 65  sult,1,nPrefixRe
7570: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7580: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
7590: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
75a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
75b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
75c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
75d0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
75e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
75f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7600: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
7610: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
7620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7630: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7640: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
7650: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7660: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
7670: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
7680: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7690: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
76a0: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
76b0: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
76c0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
76d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
76e0: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
76f0: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
7700: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
7710: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
7720: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
7730: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
7740: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
7750: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
7760: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
7770: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
7780: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
7790: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
77a0: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
77b0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
77c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
77d0: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
77e0: 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
77f0: 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  st =.           
7800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
7810: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
7820: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7830: 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
7840: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7850: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
7860: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
7870: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
7880: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
7890: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
78a0: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
78b0: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
78c0: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
78d0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
78e0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
78f0: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
7900: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
7910: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
7920: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
7930: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
7940: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
7950: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
7960: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7970: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7980: 52 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c  Result, regResul
7990: 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67  t, 1, nPrefixReg
79a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
79b0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
79c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
79d0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
79e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
79f0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
7a00: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
7a10: 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e  t,1,r1, &pDest->
7a20: 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  affSdst, 1);.   
7a30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7a40: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
7a50: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
7a60: 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20  esult, 1);.     
7a70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7a80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
7a90: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
7aa0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7ab0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
7ac0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
7ad0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7ae0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7af0: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
7b00: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
7b10: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
7b20: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
7b30: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
7b40: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
7b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7b70: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
7b80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
7b90: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
7ba0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
7bb0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
7bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
7bd0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
7be0: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
7bf0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
7c00: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
7c10: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
7c20: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
7c30: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
7c40: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
7c50: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
7c60: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
7c70: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
7c80: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
7c90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
7ca0: 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20  esultCol==1 );. 
7cb0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
7cc0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
7cd0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
7ce0: 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65   pSort, p, regRe
7cf0: 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  sult, regResult,
7d00: 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b   1, nPrefixReg);
7d10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7d20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
7d30: 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29  gResult==iParm )
7d40: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
7d50: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
7d60: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
7d70: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
7d80: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
7d90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
7da0: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
7db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7dc0: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  ERY */..    case
7dd0: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
7de0: 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61        /* Send da
7df0: 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69  ta to a co-routi
7e00: 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ne */.    case S
7e10: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20  RT_Output: {    
7e20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
7e30: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
7e40: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7e50: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
7e60: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
7e70: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7e80: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
7e90: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7ea0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7eb0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7ec0: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
7ed0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
7ee0: 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ultCol,.        
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
7f00: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
7f10: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
7f20: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
7f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7f40: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
7f50: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
7f60: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
7f70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7f80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7f90: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
7fa0: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  ow, regResult, n
7fb0: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
7fc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7fd0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7fe0: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
7ff0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8000: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
8020: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8030: 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72  IT_CTE.    /* Wr
8040: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
8050: 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20  into a priority 
8060: 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72  queue that is or
8070: 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  der according to
8080: 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70  .    ** pDest->p
8090: 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29  OrderBy (in pSO)
80a0: 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  .  pDest->iSDPar
80b0: 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20  m (in iParm) is 
80c0: 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61  the cursor for a
80d0: 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77  n.    ** index w
80e0: 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32  ith pSO->nExpr+2
80f0: 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64   columns.  Build
8100: 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f   a key using pSO
8110: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20   for the first. 
8120: 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72     ** pSO->nExpr
8130: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d   columns, then m
8140: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79  ake sure all key
8150: 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20  s are unique by 
8160: 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20  adding a.    ** 
8170: 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63  final OP_Sequenc
8180: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c  e column.  The l
8190: 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  ast column is th
81a0: 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c  e record as a bl
81b0: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ob..    */.    c
81c0: 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75  ase SRT_DistQueu
81d0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
81e0: 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69  Queue: {.      i
81f0: 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69  nt nKey;.      i
8200: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20  nt r1, r2, r3;. 
8210: 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73       int addrTes
8220: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70  t = 0;.      Exp
8230: 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20  rList *pSO;.    
8240: 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70    pSO = pDest->p
8250: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61  OrderBy;.      a
8260: 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20  ssert( pSO );.  
8270: 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e      nKey = pSO->
8280: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20  nExpr;.      r1 
8290: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
82a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
82b0: 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
82c0: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
82d0: 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  se, nKey+2);.   
82e0: 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b     r3 = r2+nKey+
82f0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  1;.      if( eDe
8300: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
8310: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
8320: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
8330: 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c  on is DistQueue,
8340: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
8350: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
8360: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73         ** on a s
8370: 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20  econd ephemeral 
8380: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
8390: 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72   all values ever
83a0: 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20  y previously.   
83b0: 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
83c0: 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20   the queue. */. 
83d0: 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20         addrTest 
83e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
83f0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
8400: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20  nd, iParm+1, 0, 
8410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
8440: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8450: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
8460: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
8470: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
8480: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8490: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
84a0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
84b0: 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66  l, r3);.      if
84c0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
84d0: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
84e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
84f0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
8500: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33  ert, iParm+1, r3
8510: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8520: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
8530: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
8540: 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d  RESULT);.      }
8550: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8560: 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20  i<nKey; i++){.  
8570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8580: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
8590: 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  opy,.           
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
85b0: 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e  egResult + pSO->
85c0: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
85d0: 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20  yCol - 1,.      
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20      r2+i);.     
8600: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8610: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8620: 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d  _Sequence, iParm
8630: 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20  , r2+nKey);.    
8640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8650: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
8660: 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32  cord, r2, nKey+2
8670: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
8680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8690: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
86a0: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
86b0: 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29    if( addrTest )
86c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
86d0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74  Here(v, addrTest
86e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
86f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8700: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
8710: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
8720: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
8730: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
8740: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8750: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8760: 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
8770: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
8780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
8790: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
87a0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
87b0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
87c0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
87d0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
87e0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
87f0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
8800: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
8810: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
8820: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
8830: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
8840: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
8850: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
8860: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
8870: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
8880: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
8890: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
88a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
88b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
88c0: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
88d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
88e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
88f0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
8900: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
8910: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
8920: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
8930: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
8940: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
8950: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
8960: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
8970: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
8980: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
8990: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f  ..  */.  if( pSo
89a0: 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  rt==0 && p->iLim
89b0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
89c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
89d0: 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
89e0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
89f0: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
8a00: 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (v);.  }.}../*.*
8a10: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  * Allocate a Key
8a20: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66  Info object suff
8a30: 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  icient for an in
8a40: 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c  dex of N key col
8a50: 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78  umns and.** X ex
8a60: 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  tra columns..*/.
8a70: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
8a80: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c  KeyInfoAlloc(sql
8a90: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c  ite3 *db, int N,
8aa0: 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e   int X){.  KeyIn
8ab0: 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44  fo *p = sqlite3D
8ac0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a  bMallocZero(0, .
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ae0: 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66     sizeof(KeyInf
8af0: 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65  o) + (N+X)*(size
8b00: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29  of(CollSeq*)+1))
8b10: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
8b20: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d   p->aSortOrder =
8b30: 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b   (u8*)&p->aColl[
8b40: 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69  N+X];.    p->nFi
8b50: 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20  eld = (u16)N;.  
8b60: 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28    p->nXField = (
8b70: 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e  u16)X;.    p->en
8b80: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
8b90: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
8ba0: 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
8bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d  }else{.    db->m
8bc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
8bd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
8be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
8bf0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
8c00: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
8c10: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
8c20: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
8c30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
8c40: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
8c50: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d  );.    p->nRef--
8c60: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  ;.    if( p->nRe
8c70: 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62  f==0 ) sqlite3Db
8c80: 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a  Free(0, p);.  }.
8c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
8ca0: 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  new pointer to a
8cb0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
8cc0: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
8cd0: 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65  te3KeyInfoRef(Ke
8ce0: 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28  yInfo *p){.  if(
8cf0: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
8d00: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ( p->nRef>0 );. 
8d10: 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20     p->nRef++;.  
8d20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
8d30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8d40: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
8d50: 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79 49  n TRUE if a KeyI
8d60: 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  nfo object can b
8d70: 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b  e change.  The K
8d80: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  eyInfo object.**
8d90: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61   can only be cha
8da0: 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73 20  nged if this is 
8db0: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65  just a single re
8dc0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f  ference to the o
8dd0: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bject..**.** Thi
8de0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
8df0: 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66  d only inside of
8e00: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
8e10: 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
8e20: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
8e30: 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a  teable(KeyInfo *
8e40: 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52  p){ return p->nR
8e50: 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20  ef==1; }.#endif 
8e60: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
8e70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
8e80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
8e90: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
8ea0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
8eb0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
8ec0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
8ed0: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
8ee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
8ef0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
8f00: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
8f10: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
8f20: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
8f30: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
8f40: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
8f50: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
8f60: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
8f70: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
8f80: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
8f90: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
8fa0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
8fb0: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
8fc0: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
8fd0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
8fe0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
8ff0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
9000: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
9010: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
9020: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
9030: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
9040: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
9050: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
9060: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
9070: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
9080: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
9090: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
90a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
90b0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
90c0: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
90d0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
90e0: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
90f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
9100: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
9110: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
9120: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
9150: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
9160: 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66   Form the KeyInf
9170: 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68  o object from th
9180: 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20  is ExprList */. 
9190: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20   int iStart,    
91a0: 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77        /* Begin w
91b0: 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ith this column 
91c0: 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  of pList */.  in
91d0: 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20  t nExtra        
91e0: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
91f0: 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  any extra column
9200: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  s to the end */.
9210: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
9220: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
9230: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
9240: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
9250: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9260: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
9270: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
9280: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
9290: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
92a0: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
92b0: 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e   nExpr-iStart, n
92c0: 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20  Extra+1);.  if( 
92d0: 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73  pInfo ){.    ass
92e0: 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
92f0: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
9300: 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72  Info) );.    for
9310: 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d  (i=iStart, pItem
9320: 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74  =pList->a+iStart
9330: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
9340: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
9350: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
9360: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
9370: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
9380: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
9390: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
93a0: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
93b0: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
93c0: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
93d0: 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d  Coll[i-iStart] =
93e0: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49   pColl;.      pI
93f0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
9400: 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65  i-iStart] = pIte
9410: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
9420: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9430: 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pInfo;.}../*.**
9440: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
9450: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
9460: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
9470: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
9480: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9490: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
94a0: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
94b0: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
94c0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
94d0: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
94e0: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
94f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
9500: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
9510: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
9520: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9530: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
9540: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
9550: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
9560: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
9570: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
9580: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
9590: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
95a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
95b0: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  LAIN./*.** Unles
95c0: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
95d0: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
95e0: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
95f0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9600: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9610: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9620: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9630: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9640: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9650: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
9660: 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  tion is of the f
9670: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53  orm:.**.**   "US
9680: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
9690: 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65  R xxx".**.** whe
96a0: 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66  re xxx is one of
96b0: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52   "DISTINCT", "OR
96c0: 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55  DER BY" or "GROU
96d0: 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77  P BY". Exactly w
96e0: 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72  hich.** is deter
96f0: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73  mined by the zUs
9700: 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  age argument..*/
9710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9720: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61  lainTempTable(Pa
9730: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
9740: 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29  st char *zUsage)
9750: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
9760: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
9770: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9780: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
9790: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
97a0: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
97b0: 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50  e->db, "USE TEMP
97c0: 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c   B-TREE FOR %s",
97d0: 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71   zUsage);.    sq
97e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
97f0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
9800: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
9810: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
9820: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
9830: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65  ../*.** Assign e
9840: 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c  xpression b to l
9850: 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e  value a. A secon
9860: 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f  d, no-op, versio
9870: 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a  n of this macro.
9880: 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77  ** is provided w
9890: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  hen SQLITE_OMIT_
98a0: 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e  EXPLAIN is defin
98b0: 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ed. This allows 
98c0: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73  the code.** in s
98d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74  qlite3Select() t
98e0: 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20  o assign values 
98f0: 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d  to structure mem
9900: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  ber variables th
9910: 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74  at.** only exist
9920: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
9930: 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64  EXPLAIN is not d
9940: 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70  efined without p
9950: 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20  olluting the.** 
9960: 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65  code with #ifnde
9970: 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f  f directives..*/
9980: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
9990: 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62  nSetInteger(a, b
99a0: 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f  ) a = b..#else./
99b0: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
99c0: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
99d0: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
99e0: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
99f0: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65  define explainTe
9a00: 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64  mpTable(y,z).# d
9a10: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
9a20: 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e  Integer(y,z).#en
9a30: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
9a40: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
9a50: 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e  PLAIN) && !defin
9a60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
9a70: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a  OMPOUND_SELECT).
9a80: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
9a90: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
9aa0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
9ab0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
9ac0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
9ad0: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
9ae0: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
9af0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
9b00: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
9b10: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
9b20: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
9b30: 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
9b40: 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a   two forms:.**.*
9b50: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
9b60: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
9b70: 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a  and iSub2 (op)".
9b80: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
9b90: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
9ba0: 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47   and iSub2 USING
9bb0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70   TEMP B-TREE (op
9bc0: 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69  )".**.** where i
9bd0: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61  Sub1 and iSub2 a
9be0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20  re the integers 
9bf0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
9c00: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66  rresponding.** f
9c10: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
9c20: 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68  rs, and op is th
9c30: 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  e text represent
9c40: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
9c50: 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
9c60: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20   same name. The 
9c70: 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d  parameter "op" m
9c80: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b  ust be one of TK
9c90: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
9ca0: 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45  T,.** TK_INTERSE
9cb0: 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68  CT or TK_ALL. Th
9cc0: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20  e first form is 
9cd0: 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74  used if argument
9ce0: 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20   bUseTmp is .** 
9cf0: 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65  false, or the se
9d00: 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20  cond form if it 
9d10: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
9d20: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43  ic void explainC
9d30: 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73  omposite(.  Pars
9d40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9d60: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
9d70: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
9da0: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20  NION, TK_EXCEPT 
9db0: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  etc. */.  int iS
9dc0: 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub1,            
9dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
9de0: 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20  query id 1 */.  
9df0: 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20  int iSub2,      
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32  /* Subquery id 2
9e20: 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d   */.  int bUseTm
9e30: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
9e40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
9e50: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61   a temp table wa
9e60: 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  s used */.){.  a
9e70: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e  ssert( op==TK_UN
9e80: 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58  ION || op==TK_EX
9e90: 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
9ea0: 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d  NTERSECT || op==
9eb0: 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20  TK_ALL );.  if( 
9ec0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
9ed0: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
9ee0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9ef0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
9f00: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
9f10: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
9f20: 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e  se->db, "COMPOUN
9f30: 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20  D SUBQUERIES %d 
9f40: 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20  AND %d %s(%s)", 
9f50: 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20  iSub1, iSub2,.  
9f60: 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55        bUseTmp?"U
9f70: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
9f80: 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e   ":"", selectOpN
9f90: 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20  ame(op).    );. 
9fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9fb0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9fc0: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9fd0: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9fe0: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
9ff0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e    }.}.#else./* N
a000: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
a010: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
a020: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
a030: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
a040: 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ine explainCompo
a050: 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a  site(v,w,x,y,z).
a060: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
a070: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
a080: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
a090: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
a0a0: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
a0b0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
a0c0: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
a0d0: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
a0e0: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
a0f0: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
a100: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
a110: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
a120: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
a130: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
a140: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
a150: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
a160: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
a170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a180: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
a190: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
a1a0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a1b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
a1c0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
a1d0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
a1e0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f  tatement */.  So
a1f0: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
a200: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  /* Information o
a210: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
a220: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
a230: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20  Column,      /* 
a240: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
a250: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53  s of data */.  S
a260: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
a270: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
a280: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
a290: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
a2a0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a2b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a2c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
a2d0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a2e0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
a2f0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
a300: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
a310: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
a320: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
a330: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
a340: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
a350: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
a360: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
a370: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
a380: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
a390: 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
a3a0: 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72  int iTab;.  Expr
a3b0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
a3c0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
a3d0: 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ;.  int eDest = 
a3e0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
a3f0: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
a400: 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e  t->iSDParm;.  in
a410: 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20  t regRow;.  int 
a420: 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  regRowid;.  int 
a430: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
a440: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
a450: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
a460: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
a470: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
a480: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
a490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a4a0: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
a4b0: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
a4c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  r */.  int i;.  
a4d0: 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20  int bSeq;       
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65  /* True if sorte
a500: 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65  r record include
a510: 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69  s seq. no. */.#i
a520: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a530: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
a540: 4e 54 53 0a 20 20 73 74 72 75 63 74 20 45 78 70  NTS.  struct Exp
a550: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74  rList_item *aOut
a560: 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Ex = p->pEList->
a570: 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  a;.#endif..  if(
a580: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a590: 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
a5a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a5b0: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
a5c0: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
a5d0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
a5e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
a5f0: 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  to(v, addrBreak)
a600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a610: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a620: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a630: 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20  ut);.  }.  iTab 
a640: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
a650: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
a660: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
a670: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
a680: 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  ne ){.    regRow
a690: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
a6a0: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
a6b0: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
a6c0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
a6d0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
a6e0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
a6f0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a700: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
a710: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a720: 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74  arse);.    nSort
a730: 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Data = 1;.  }.  
a740: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
a750: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
a760: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
a770: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
a780: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
a790: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
a7a0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
a7b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
a7c0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
a7d0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
a7e0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
a7f0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
a800: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
a810: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
a820: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
a830: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
a840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a850: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
a860: 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f   iSortTab, regSo
a870: 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53  rtOut, nKey+1+nS
a880: 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ortData);.    if
a890: 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c  ( addrOnce ) sql
a8a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a8b0: 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
a8c0: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
a8d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a8e0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
a8f0: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
a900: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
a910: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
a920: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
a930: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
a940: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
a950: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a960: 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54  P_SorterData, iT
a970: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
a980: 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62  iSortTab);.    b
a990: 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Seq = 0;.  }else
a9a0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
a9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a9c0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
a9d0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
a9e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a9f0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
aa00: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
aa10: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
aa20: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54     iSortTab = iT
aa30: 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31  ab;.    bSeq = 1
aa40: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
aa50: 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b   i<nSortData; i+
aa60: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
aa70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
aa80: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
aa90: 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72  , nKey+bSeq+i, r
aaa0: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64  egRow+i);.    Vd
aab0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
aac0: 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  s", aOutEx[i].zN
aad0: 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e  ame ? aOutEx[i].
aae0: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
aaf0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20  ].zSpan));.  }. 
ab00: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
ab10: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  {.    case SRT_E
ab20: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
ab30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab40: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
ab50: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
ab60: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
ab70: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ab80: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
ab90: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
aba0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
abb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
abc0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
abd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
abe0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
abf0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
ac00: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
ac10: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
ac20: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
ac30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ac40: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
ac50: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
ac60: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
ac70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ac80: 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d           &pDest-
ac90: 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20  >affSdst, 1);.  
aca0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
acb0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
acc0: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ge(pParse, regRo
acd0: 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  w, 1);.      sql
ace0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
acf0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
ad00: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
ad10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ad20: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
ad30: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
ad40: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
ad50: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
ad60: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
ad70: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69  Parse, regRow, i
ad80: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
ad90: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
ada0: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
adb0: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
adc0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
add0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
ade0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
adf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
ae00: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
ae10: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
ae20: 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20  outine ); .     
ae30: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
ae40: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
ae50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ae60: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
ae70: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  tine );.      if
ae80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
ae90: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
aea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aeb0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
aec0: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
aed0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
aee0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
aef0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
af00: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e  (pParse, pDest->
af10: 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  iSdst, nColumn);
af20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
af30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af40: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
af50: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
af60: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
af70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
af80: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f  .  }.  if( regRo
af90: 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  wid ){.    sqlit
afa0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
afb0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29  (pParse, regRow)
afc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
afd0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
afe0: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
aff0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74   }.  /* The bott
b000: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
b010: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
b020: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
b030: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
b040: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
b050: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
b060: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
b070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b080: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
b090: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
b0a0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
b0b0: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
b0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b0d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
b0e0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
b0f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b100: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72  }.  if( pSort->r
b110: 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74  egReturn ) sqlit
b120: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b130: 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  OP_Return, pSort
b140: 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
b150: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
b160: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
b170: 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reak);.}../*.** 
b180: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
b190: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
b1a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
b1b0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
b1c0: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
b1d0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
b1e0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
b1f0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
b200: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
b210: 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20  .** Also try to 
b220: 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a  estimate the siz
b230: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
b240: 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  d value and retu
b250: 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  rn that.** resul
b260: 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e  t in *pEstWidth.
b270: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
b280: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
b290: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
b2a0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
b2b0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
b2c0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
b2d0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
b2e0: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
b2f0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
b300: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
b310: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
b320: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
b330: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
b340: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
b350: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
b360: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
b370: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
b380: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
b390: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
b3a0: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
b3b0: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
b3c0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
b3d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b3e0: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
b3f0: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
b400: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
b410: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
b420: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
b430: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
b440: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
b450: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
b460: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
b470: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
b480: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
b490: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
b4a0: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
b4b0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
b4c0: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
b4d0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
b4e0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
b4f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b500: 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20  ne has either 3 
b510: 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20  or 6 parameters 
b520: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
b530: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
b540: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
b550: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b560: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
b570: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f  tion is used..*/
b580: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b590: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b5a0: 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63  ADATA.# define c
b5b0: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
b5c0: 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70  D,E,F) columnTyp
b5d0: 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c  eImpl(A,B,C,D,E,
b5e0: 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  F).#else /* if !
b5f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
b600: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b610: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
b620: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
b630: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
b640: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29  nTypeImpl(A,B,F)
b650: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
b660: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
b670: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
b680: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
b690: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 23    Expr *pExpr,.#
b6a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b6b0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
b6c0: 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ATA.  const char
b6d0: 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63   **pzOrigDb,.  c
b6e0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
b6f0: 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  igTab,.  const c
b700: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c  har **pzOrigCol,
b710: 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a 70 45  .#endif.  u8 *pE
b720: 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61  stWidth.){.  cha
b730: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
b740: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75   0;.  int j;.  u
b750: 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a  8 estWidth = 1;.
b760: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b770: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b780: 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e 73  DATA.  char cons
b790: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
b7a0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
b7b0: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
b7c0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
b7d0: 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ol = 0;.#endif..
b7e0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
b7f0: 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53  r==0) || pNC->pS
b800: 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  rcList==0 ) retu
b810: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
b820: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
b830: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
b840: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
b850: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
b860: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
b870: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
b880: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
b890: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
b8a0: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
b8b0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
b8c0: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
b8d0: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
b8e0: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
b8f0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
b900: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
b910: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
b920: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
b930: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
b940: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
b950: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
b960: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
b970: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
b980: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b990: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
b9a0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
b9b0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
b9c0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
b9d0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
b9e0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
b9f0: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
ba00: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
ba10: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
ba20: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
ba30: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
ba40: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
ba50: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
ba60: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
ba70: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
ba80: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
ba90: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
baa0: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
bab0: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
bac0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
bad0: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
bae0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
baf0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
bb00: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
bb10: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
bb20: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
bb30: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
bb40: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
bb50: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
bb60: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
bb70: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
bb80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
bb90: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
bba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
bbb0: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
bbc0: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
bbd0: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
bbe0: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
bbf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
bc00: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
bc10: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
bc20: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
bc30: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
bc40: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
bc50: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
bc60: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
bc70: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
bc80: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
bc90: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
bca0: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
bcb0: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
bcc0: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
bcd0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
bce0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
bcf0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
bd00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
bd10: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
bd20: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
bd30: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
bd40: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
bd50: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
bd60: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
bd70: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
bd80: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
bd90: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
bda0: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
bdb0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
bdc0: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
bdd0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
bde0: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
bdf0: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
be00: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
be10: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
be20: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
be30: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
be40: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
be50: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
be60: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
be70: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
be80: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
be90: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
bea0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
beb0: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
bec0: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
bed0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
bee0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
bef0: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
bf00: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
bf10: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
bf20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
bf40: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
bf50: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
bf60: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
bf70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
bf80: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
bf90: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
bfa0: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
bfb0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
bfc0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
bfd0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
bfe0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
bff0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
c000: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
c010: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
c020: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
c030: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
c040: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
c050: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c060: 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  l>=0 && ALWAYS(i
c070: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
c080: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
c090: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
c0a0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
c0b0: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
c0c0: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
c0d0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
c0e0: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
c0f0: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
c100: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
c110: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
c120: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
c130: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
c140: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
c150: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
c160: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
c170: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 41          ** The A
c180: 4c 57 41 59 53 28 29 20 69 73 20 62 65 63 61 75  LWAYS() is becau
c190: 73 65 20 69 43 6f 6c 3e 3d 70 53 2d 3e 70 45 4c  se iCol>=pS->pEL
c1a0: 69 73 74 2d 3e 6e 45 78 70 72 20 77 69 6c 6c 20  ist->nExpr will 
c1b0: 68 61 76 65 20 62 65 65 6e 0a 20 20 20 20 20 20  have been.      
c1c0: 20 20 20 20 2a 2a 20 63 61 75 67 68 74 20 61 6c      ** caught al
c1d0: 72 65 61 64 79 20 62 79 20 6e 61 6d 65 20 72 65  ready by name re
c1e0: 73 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20 20 20 20  solution..      
c1f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
c200: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
c210: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
c220: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
c230: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
c240: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
c250: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
c260: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
c270: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
c280: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
c290: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
c2a0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
c2b0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
c2c0: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
c2d0: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
c2e0: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
c2f0: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
c300: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
c310: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
c320: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
c330: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
c340: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
c350: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c360: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
c370: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
c380: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
c390: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
c3a0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
c3b0: 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) );.#ifdef SQLI
c3c0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c3d0: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20  _METADATA.      
c3e0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
c3f0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
c400: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
c410: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
c420: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
c430: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c440: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
c450: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
c460: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  pe;.          zO
c470: 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  rigCol = pTab->a
c480: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
c490: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
c4a0: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
c4b0: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
c4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c4d0: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
c4e0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
c4f0: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
c500: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
c510: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
c520: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
c530: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
c540: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
c550: 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d         zOrigDb =
c560: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
c570: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
c580: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
c590: 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  e.        if( iC
c5a0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
c5b0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
c5c0: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ER";.        }el
c5d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
c5e0: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
c5f0: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
c600: 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74 68          estWidth
c610: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
c620: 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20  ol].szEst;.     
c630: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
c640: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
c650: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
c660: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
c670: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
c680: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
c690: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
c6a0: 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  n is a sub-selec
c6b0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
c6c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
c6d0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67  nd.      ** orig
c6e0: 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20  in info for the 
c6f0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e  single column in
c700: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
c710: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
c720: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
c730: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c740: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
c750: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
c760: 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  pS = pExpr->x.pS
c770: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
c780: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
c790: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
c7a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
c7b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
c7c0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
c7d0: 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ) );.      sNC.p
c7e0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
c7f0: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
c800: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
c810: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
c820: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
c830: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
c840: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
c850: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
c860: 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73  , &zOrigCol, &es
c870: 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20  tWidth); .      
c880: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
c890: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  dif.  }..#ifdef 
c8a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c8b0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a  LUMN_METADATA  .
c8c0: 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29    if( pzOrigDb )
c8d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a  {.    assert( pz
c8e0: 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69  OrigTab && pzOri
c8f0: 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f  gCol );.    *pzO
c900: 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b  rigDb = zOrigDb;
c910: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20  .    *pzOrigTab 
c920: 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20  = zOrigTab;.    
c930: 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72  *pzOrigCol = zOr
c940: 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69  igCol;.  }.#endi
c950: 66 0a 20 20 69 66 28 20 70 45 73 74 57 69 64 74  f.  if( pEstWidt
c960: 68 20 29 20 2a 70 45 73 74 57 69 64 74 68 20 3d  h ) *pEstWidth =
c970: 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65 74   estWidth;.  ret
c980: 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a  urn zType;.}../*
c990: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
c9a0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
c9b0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65   the VDBE the de
c9c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20  claration types 
c9d0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
c9e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
c9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ca00: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
ca10: 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pes(.  Parse *pP
ca20: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
ca30: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
ca40: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
ca50: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
ca60: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
ca70: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
ca80: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
ca90: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
caa0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69  ult set */.){.#i
cab0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cac0: 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62  T_DECLTYPE.  Vdb
cad0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
cae0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
caf0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
cb00: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
cb10: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73   = pTabList;.  s
cb20: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
cb30: 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  se;.  for(i=0; i
cb40: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
cb50: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
cb60: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
cb70: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
cb80: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23  t char *zType;.#
cb90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cba0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
cbb0: 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ATA.    const ch
cbc0: 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  ar *zOrigDb = 0;
cbd0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
cbe0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
cbf0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cc00: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  OrigCol = 0;.   
cc10: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
cc20: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
cc30: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
cc40: 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b  , &zOrigCol, 0);
cc50: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
cc60: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
cc70: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
cc80: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
cc90: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
cca0: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
ccb0: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
ccc0: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
ccd0: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
cce0: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
ccf0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
cd00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
cd10: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
cd20: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
cd30: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
cd40: 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  Db, SQLITE_TRANS
cd50: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
cd60: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
cd70: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
cd80: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
cd90: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
cda0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
cdb0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
cdc0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
cdd0: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c  N, zOrigCol, SQL
cde0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
cdf0: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
ce00: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
ce10: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  C, p, 0, 0, 0, 0
ce20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
ce30: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
ce40: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
ce50: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
ce60: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
ce70: 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ENT);.  }.#endif
ce80: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
ce90: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
cea0: 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E) */.}../*.** G
ceb0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
cec0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
ced0: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
cee0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
cef0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
cf00: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
cf10: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
cf20: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
cf30: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
cf40: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
cf50: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
cf60: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
cf70: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cf80: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
cf90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
cfa0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
cfb0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
cfc0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
cfd0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
cfe0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
cff0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
d000: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
d010: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
d020: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
d030: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d040: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
d050: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
d060: 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65  rtNames;..#ifnde
d070: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
d080: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
d090: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
d0a0: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
d0b0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
d0c0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
d0d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
d0e0: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73  dif..  if( pPars
d0f0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
d100: 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c  | NEVER(v==0) ||
d110: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d120: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  d ) return;.  pP
d130: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
d140: 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
d150: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
d160: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
d170: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f  Names)!=0;.  sho
d180: 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  rtNames = (db->f
d190: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
d1a0: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ortColNames)!=0;
d1b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
d1c0: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
d1d0: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
d1e0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
d1f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d200: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70    Expr *p;.    p
d210: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
d220: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e  pExpr;.    if( N
d230: 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e  EVER(p==0) ) con
d240: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
d250: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
d260: 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
d270: 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
d280: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
d290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d2a0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d2b0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
d2c0: 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  me, SQLITE_TRANS
d2d0: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
d2e0: 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f   if( (p->op==TK_
d2f0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d  COLUMN || p->op=
d300: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
d310: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
d320: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
d330: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
d340: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
d350: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
d360: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
d370: 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73  ALWAYS(j<pTabLis
d380: 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a  t->nSrc); j++){.
d390: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
d3a0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
d3b0: 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20  or==p->iTable ) 
d3c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d3d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
d3e0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
d3f0: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
d400: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
d410: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
d420: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
d430: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
d440: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
d450: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
d460: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
d470: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
d480: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
d490: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
d4a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d4b0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
d4c0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
d4d0: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
d4e0: 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65    if( !shortName
d4f0: 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20  s && !fullNames 
d500: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d510: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d520: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
d530: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
d540: 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75    sqlite3DbStrDu
d550: 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
d560: 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54  i].zSpan), SQLIT
d570: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
d580: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c    }else if( full
d590: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
d5a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
d5b0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
d5c0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d5d0: 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  (db, "%s.%s", pT
d5e0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ab->zName, zCol)
d5f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d600: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d610: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d620: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
d630: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
d640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d650: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d660: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d670: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
d680: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d690: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
d6a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
d6b0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c  st char *z = pEL
d6c0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
d6d0: 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20  .      z = z==0 
d6e0: 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  ? sqlite3MPrintf
d6f0: 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  (db, "column%d",
d700: 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44   i+1) : sqlite3D
d710: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a  bStrDup(db, z);.
d720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d730: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d740: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d750: 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  z, SQLITE_DYNAMI
d760: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  C);.    }.  }.  
d770: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
d780: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
d790: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
d7a0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
d7b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d7c0: 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
d7d0: 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  y the list of ex
d7e0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
d7f0: 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c  t form the resul
d800: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
d810: 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d  T statement) com
d820: 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65  pute appropriate
d830: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** column names
d840: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
d850: 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  t would hold the
d860: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d870: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75  ..**.** All colu
d880: 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65  mn names will be
d890: 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f   unique..**.** O
d8a0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
d8b0: 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65  ames are compute
d8c0: 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  d.  Column.zType
d8d0: 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a  , Column.zColl,.
d8e0: 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
d8f0: 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72  lds of Column ar
d900: 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
d910: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
d920: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
d930: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
d940: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
d950: 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c  s,.** store NULL
d960: 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30   in *paCol and 0
d970: 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72   in *pnCol and r
d980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d990: 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  EM..*/.int sqlit
d9a0: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
d9b0: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
d9c0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d9d0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d9e0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
d9f0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
da00: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
da10: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
da20: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
da30: 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da50: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
da60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
da70: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
da80: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
da90: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
daa0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
dab0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
dac0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
dad0: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
dae0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
daf0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
db00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
db10: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
db20: 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20    u32 cnt;      
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db40: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
db50: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
db60: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
db70: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
db80: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
db90: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
dba0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
dbb0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
dbc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
dbd0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
dbe0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
dbf0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
dc20: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
dc30: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
dc40: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
dc60: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
dc70: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
dc90: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
dca0: 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68  Name[] */.  Hash
dcb0: 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20   ht;            
dcc0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
dcd0: 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  table of column 
dce0: 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69  names */..  sqli
dcf0: 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74 29  te3HashInit(&ht)
dd00: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 29  ;.  if( pEList )
dd10: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c  {.    nCol = pEL
dd20: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
dd30: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  aCol = sqlite3Db
dd40: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
dd50: 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e  izeof(aCol[0])*n
dd60: 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Col);.    testca
dd70: 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  se( aCol==0 );. 
dd80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
dd90: 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d   = 0;.    aCol =
dda0: 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c   0;.  }.  *pnCol
ddb0: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f   = nCol;.  *paCo
ddc0: 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72  l = aCol;..  for
ddd0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
dde0: 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e   i<nCol && !db->
ddf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b  mallocFailed; i+
de00: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
de10: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
de20: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
de30: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
de40: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
de50: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
de60: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
de70: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  pr);.    if( (zN
de80: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
de90: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
dea0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
deb0: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
dec0: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
ded0: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
dee0: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
def0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
df00: 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72    Expr *pColExpr
df10: 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78   = p;  /* The ex
df20: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
df30: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
df40: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
df50: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
df60: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61        /* Table a
df70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
df80: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
df90: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
dfa0: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
dfb0: 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70  DOT ){.        p
dfc0: 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78  ColExpr = pColEx
dfd0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
dfe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
dff0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
e000: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f   }.      if( pCo
e010: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
e020: 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70  LUMN && ALWAYS(p
e030: 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30  ColExpr->pTab!=0
e040: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
e050: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20  For columns use 
e060: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
e070: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
e080: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45  int iCol = pColE
e090: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
e0a0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f        pTab = pCo
e0b0: 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  lExpr->pTab;.   
e0c0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
e0d0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
e0e0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e  PKey;.        zN
e0f0: 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  ame = iCol>=0 ? 
e100: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
e110: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
e120: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e130: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
e140: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
e150: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
e160: 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
e170: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
e180: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
e190: 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  e = pColExpr->u.
e1a0: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  zToken;.      }e
e1b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
e1c0: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
e1d0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
e1e0: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
e1f0: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
e200: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
e210: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
e220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e230: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e240: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e250: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20  %s", zName);..  
e260: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e270: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
e280: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
e290: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
e2a0: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
e2b0: 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
e2c0: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
e2d0: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
e2e0: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
e2f0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
e300: 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71  ile( zName && sq
e310: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 68  lite3HashFind(&h
e320: 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  t, zName)!=0 ){.
e330: 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71        nName = sq
e340: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
e350: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
e360: 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20  nName>0 ){.     
e370: 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31     for(j=nName-1
e380: 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33  ; j>0 && sqlite3
e390: 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d  Isdigit(zName[j]
e3a0: 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20  ); j--){}.      
e3b0: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d    if( zName[j]==
e3c0: 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b  ':' ) nName = j;
e3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
e3e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
e3f0: 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a  rintf(db, "%.*z:
e400: 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  %u", nName, zNam
e410: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
e420: 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c   if( cnt>3 ) sql
e430: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
e440: 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e  sizeof(cnt), &cn
e450: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  t);.    }.    pC
e460: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
e470: 65 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  e;.    if( zName
e480: 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49   && sqlite3HashI
e490: 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65  nsert(&ht, zName
e4a0: 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b  , pCol)==pCol ){
e4b0: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
e4c0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
e4d0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
e4e0: 48 61 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a  HashClear(&ht);.
e4f0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e500: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f  Failed ){.    fo
e510: 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
e520: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
e530: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a  bFree(db, aCol[j
e540: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
e550: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e560: 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20  e(db, aCol);.   
e570: 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *paCol = 0;.   
e580: 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *pnCol = 0;.   
e590: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e5a0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
e5b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e5c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
e5d0: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
e5e0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
e5f0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
e600: 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
e610: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
e620: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
e630: 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
e640: 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
e650: 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
e660: 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
e670: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
e680: 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
e690: 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
e6a0: 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
e6b0: 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
e6c0: 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
e6d0: 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
e6e0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
e6f0: 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
e700: 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
e710: 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
e720: 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
e730: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
e740: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
e750: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
e760: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
e770: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e780: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
e790: 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
e7a0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
e7b0: 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
e7c0: 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
e7d0: 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
e7e0: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
e7f0: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
e800: 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
e810: 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
e820: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
e830: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
e840: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
e850: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
e860: 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
e870: 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
e880: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
e890: 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
e8a0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e8b0: 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20  *a;.  u64 szAll 
e8c0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
e8d0: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
e8e0: 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74  assert( (pSelect
e8f0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
e900: 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a  Resolved)!=0 );.
e910: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
e920: 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70  nCol==pSelect->p
e930: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20  EList->nExpr || 
e940: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e950: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
e960: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
e970: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  urn;.  memset(&s
e980: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
e990: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  C));.  sNC.pSrcL
e9a0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
e9b0: 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65  Src;.  a = pSele
e9c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  ct->pEList->a;. 
e9d0: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70   for(i=0, pCol=p
e9e0: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61  Tab->aCol; i<pTa
e9f0: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
ea00: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61  ol++){.    p = a
ea10: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
ea20: 66 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d  f( pCol->zType==
ea30: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
ea40: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
ea50: 44 62 53 74 72 44 75 70 28 64 62 2c 20 0a 20 20  DbStrDup(db, .  
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 54 79 70 65        columnType
ea80: 28 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20  (&sNC, p,0,0,0, 
ea90: 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a  &pCol->szEst));.
eaa0: 20 20 20 20 7d 0a 20 20 20 20 73 7a 41 6c 6c 20      }.    szAll 
eab0: 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  += pCol->szEst;.
eac0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
ead0: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
eae0: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
eaf0: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
eb00: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
eb10: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
eb20: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70  _AFF_BLOB;.    p
eb30: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
eb40: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
eb50: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
eb60: 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f  oll && pCol->zCo
eb70: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ll==0 ){.      p
eb80: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
eb90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
eba0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
ebb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
ebc0: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
ebd0: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
ebe0: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
ebf0: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
ec00: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
ec10: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
ec20: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
ec30: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
ec40: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
ec50: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
ec60: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
ec70: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
ec80: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
ec90: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
eca0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
ecb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ecc0: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
ecd0: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
ece0: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
ecf0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
ed00: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
ed10: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
ed20: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
ed30: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
ed40: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
ed50: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
ed60: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
ed70: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
ed80: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
ed90: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
eda0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
edb0: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
edc0: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
edd0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
ede0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
edf0: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
ee00: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
ee10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
ee20: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
ee30: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
ee40: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
ee50: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
ee60: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
ee70: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
ee80: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
ee90: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
eea0: 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  Enabled==0 );.  
eeb0: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
eec0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
eed0: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
eee0: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
eef0: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
ef00: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
ef10: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
ef20: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
ef30: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ef40: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
ef50: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
ef60: 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64  ol);.  selectAdd
ef70: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
ef80: 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
ef90: 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Tab, pSelect);. 
efa0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
efb0: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
efc0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
efd0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
efe0: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
eff0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f000: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
f010: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
f020: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
f030: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
f040: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
f050: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
f060: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
f070: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
f080: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
f090: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
f0a0: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
f0b0: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
f0c0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
f0d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
f0e0: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
f0f0: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
f100: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
f110: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
f120: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
f130: 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  v ) sqlite3VdbeA
f140: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp0(v, OP_Init
f150: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
f160: 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a  e->pToplevel==0.
f170: 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
f180: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
f190: 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61  se->db,SQLITE_Fa
f1a0: 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20  ctorOutConst).  
f1b0: 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73    ){.      pPars
f1c0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
f1d0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d   = 1;.    }..  }
f1e0: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
f1f0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
f200: 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
f210: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
f220: 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
f230: 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
f240: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78  t and pOffset ex
f250: 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d  pressions.  pLim
f260: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68  it and pOffset h
f270: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
f280: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
f290: 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
f2a0: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
f2b0: 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
f2c0: 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
f2d0: 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
f2e0: 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
f2f0: 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
f300: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
f310: 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
f320: 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
f330: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
f340: 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
f350: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
f360: 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
f370: 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
f380: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
f390: 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
f3a0: 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
f3b0: 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
f3c0: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
f3d0: 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
f3e0: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
f3f0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f400: 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
f410: 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
f420: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
f430: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e  mit and pOffset.
f440: 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
f450: 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
f460: 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
f470: 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
f480: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
f490: 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
f4a0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
f4b0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
f4c0: 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
f4d0: 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
f4e0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
f4f0: 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
f500: 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
f510: 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
f520: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
f530: 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
f540: 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
f550: 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
f560: 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
f570: 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
f580: 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70  f pLimit!=0 or p
f590: 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65  Offset!=0 do the
f5a0: 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
f5b0: 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65   get.** redefine
f5c0: 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  d.  The UNION AL
f5d0: 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20  L operator uses 
f5e0: 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f  this property to
f5f0: 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65   force.** the re
f600: 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  use of the same 
f610: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
f620: 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73   registers acros
f630: 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45  s multiple.** SE
f640: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
f650: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f660: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
f670: 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61  sters(Parse *pPa
f680: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
f690: 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56  int iBreak){.  V
f6a0: 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e  dbe *v = 0;.  in
f6b0: 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  t iLimit = 0;.  
f6c0: 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69  int iOffset;.  i
f6d0: 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69  nt n;.  if( p->i
f6e0: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a  Limit ) return;.
f6f0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d  .  /* .  ** "LIM
f700: 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68  IT -1" always sh
f710: 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54  ows all rows.  T
f720: 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a  here is some.  *
f730: 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62  * controversy ab
f740: 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72  out what the cor
f750: 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68  rect behavior sh
f760: 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68  ould be..  ** Th
f770: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
f780: 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72  entation interpr
f790: 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f  ets "LIMIT 0" to
f7a0: 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f   mean.  ** no ro
f7b0: 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ws..  */.  sqlit
f7c0: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
f7d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
f7e0: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
f7f0: 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d  0 || p->pLimit!=
f800: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  0 );.  if( p->pL
f810: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
f820: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
f830: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
f840: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
f850: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f860: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
f870: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
f880: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
f890: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29  r(p->pLimit, &n)
f8a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f8b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f8c0: 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
f8d0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
f8e0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
f8f0: 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
f900: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
f910: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f920: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
f930: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
f940: 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
f950: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36 34  >nSelectRow>(u64
f960: 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )n ){.        p-
f970: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b  >nSelectRow = n;
f980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f990: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f9a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f9b0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
f9c0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
f9d0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f9e0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
f9f0: 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
fa00: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
fa10: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
fa20: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
fa30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fa40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fa50: 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69  IfNot, iLimit, i
fa60: 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
fa70: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
fa80: 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65     if( p->pOffse
fa90: 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
faa0: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
fab0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
fac0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
fad0: 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
fae0: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
faf0: 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
fb00: 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
fb10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
fb20: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
fb30: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fset, iOffset);.
fb40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fb50: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
fb60: 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74  stBeInt, iOffset
fb70: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
fb80: 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
fb90: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
fba0: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
fbb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fbc0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 49  ddOp3(v, OP_SetI
fbd0: 66 4e 6f 74 50 6f 73 2c 20 69 4f 66 66 73 65 74  fNotPos, iOffset
fbe0: 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  , iOffset, 0);. 
fbf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fc00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64  AddOp3(v, OP_Add
fc10: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
fc20: 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  t, iOffset+1);. 
fc30: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
fc40: 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
fc50: 45 54 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ET"));.      sql
fc60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fc70: 2c 20 4f 50 5f 53 65 74 49 66 4e 6f 74 50 6f 73  , OP_SetIfNotPos
fc80: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
fc90: 74 2b 31 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  t+1, -1);.    }.
fca0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
fcb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
fcc0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
fcd0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
fce0: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
fcf0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
fd00: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
fd10: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
fd20: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
fd30: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
fd40: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
fd50: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
fd60: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
fd70: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
fd80: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
fd90: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
fda0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
fdb0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
fdc0: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
fdd0: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
fde0: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
fdf0: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
fe00: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fe10: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
fe20: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
fe30: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
fe40: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
fe50: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
fe60: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
fe70: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
fe80: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
fe90: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
fea0: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
feb0: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
fec0: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
fed0: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
fee0: 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a   iCol>=0 );.  /*
fef0: 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65   iCol must be le
ff00: 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73  ss than p->pELis
ff10: 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72  t->nExpr.  Other
ff20: 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f  wise an error wo
ff30: 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  uld.  ** have be
ff40: 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67  en thrown during
ff50: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
ff60: 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f   and we would no
ff70: 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20  t have gotten.  
ff80: 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20  ** this far */. 
ff90: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20   if( pRet==0 && 
ffa0: 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70  ALWAYS(iCol<p->p
ffb0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
ffc0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
ffd0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
ffe0: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
fff0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
10000 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
10010 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
10020 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
10030 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
10040 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
10050 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  r is a compound 
10060 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61  SELECT.** with a
10070 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
10080 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
10090 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
100a0 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f  eturns a KeyInfo
100b0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73 75  .** structure su
100c0 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65  itable for imple
100d0 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
100e0 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  R BY..**.** Spac
100f0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
10100 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
10110 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
10120 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c   malloc. The cal
10130 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
10140 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
10150 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
10160 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
10170 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
10180 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
10190 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74  ic KeyInfo *mult
101a0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
101b0 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
101c0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
101d0 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45  int nExtra){.  E
101e0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
101f0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
10200 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20  .  int nOrderBy 
10210 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  = p->pOrderBy->n
10220 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20  Expr;.  sqlite3 
10230 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10240 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65  ;.  KeyInfo *pRe
10250 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  t = sqlite3KeyIn
10260 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64  foAlloc(db, nOrd
10270 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b  erBy+nExtra, 1);
10280 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20  .  if( pRet ){. 
10290 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
102a0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
102b0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  y; i++){.      s
102c0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
102d0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f  tem *pItem = &pO
102e0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20  rderBy->a[i];.  
102f0 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20      Expr *pTerm 
10300 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
10310 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
10320 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28  Coll;..      if(
10330 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
10340 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
10350 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
10360 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
10370 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b  (pParse, pTerm);
10380 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10390 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75        pColl = mu
103a0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
103b0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65  (pParse, p, pIte
103c0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
103d0 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ol-1);.        i
103e0 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
103f0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
10400 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  oll;.        pOr
10410 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
10420 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  r =.          sq
10430 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
10440 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65  ateString(pParse
10450 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e  , pTerm, pColl->
10460 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
10470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
10480 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
10490 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b  iteable(pRet) );
104a0 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f  .      pRet->aCo
104b0 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
104c0 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74       pRet->aSort
104d0 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
104e0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
104f0 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  der;.    }.  }..
10500 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
10510 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10520 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
10530 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
10540 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65  erates VDBE code
10550 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
10560 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54  content of a WIT
10570 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71  H RECURSIVE.** q
10580 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
10590 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72  :.**.**   <recur
105a0 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28  sive-table> AS (
105b0 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e  <setup-query> UN
105c0 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72  ION [ALL] <recur
105d0 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20  sive-query>).** 
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
10600 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20  ____/           
10610 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
10620 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10640 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20   p->pPrior      
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  p.**.**.** There
10670 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
10680 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
10690 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
106a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
106b0 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73  use.** of recurs
106c0 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65  ive-query, marke
106d0 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69  d with the SrcLi
106e0 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63  st->a[].fg.isRec
106f0 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a  ursive flag..**.
10700 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65  ** The setup-que
10710 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  ry runs once to 
10720 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74  generate an init
10730 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20  ial set of rows 
10740 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20  that go.** into 
10750 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  a Queue table.  
10760 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74  Rows are extract
10770 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75  ed from the Queu
10780 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a  e table one by.*
10790 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77  * one.  Each row
107a0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
107b0 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20  Queue is output 
107c0 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20  to pDest.  Then 
107d0 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78  the single.** ex
107e0 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77  tracted row (now
107f0 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74   in the iCurrent
10800 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20   table) becomes 
10810 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
10820 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d  he.** recursive-
10830 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75  table for a recu
10840 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e  rsive-query run.
10850 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20    The output of 
10860 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75  the recursive-qu
10870 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ery.** is added 
10880 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75  back into the Qu
10890 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  eue table.  Then
108a0 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20   another row is 
108b0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
108c0 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ueue.** and the 
108d0 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e  iteration contin
108e0 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75  ues until the Qu
108f0 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  eue table is emp
10900 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
10910 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
10920 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
10930 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63  N then no duplic
10940 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65  ate rows are eve
10950 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  r.** inserted in
10960 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
10970 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e  le.  The iDistin
10980 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61  ct table keeps a
10990 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77   copy of all row
109a0 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65  s.** that have e
109b0 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ver been inserte
109c0 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64  d into Queue and
109d0 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74   causes duplicat
109e0 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63  es to be.** disc
109f0 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f  arded.  If the o
10a00 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
10a10 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69   ALL, then dupli
10a20 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  cates are allowe
10a30 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  d..** .** If the
10a40 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52   query has an OR
10a50 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74  DER BY, then ent
10a60 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75  ries in the Queu
10a70 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74  e table are kept
10a80 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
10a90 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69  order and the fi
10aa0 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74  rst entry is ext
10ab0 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20  racted for each 
10ac0 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a  cycle.  Without.
10ad0 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  ** an ORDER BY, 
10ae0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10af0 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a  is just a FIFO..
10b00 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54  **.** If a LIMIT
10b10 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69   clause is provi
10b20 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74  ded, then the it
10b30 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66  eration stops af
10b40 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a  ter LIMIT rows.*
10b50 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70  * have been outp
10b60 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20  ut to pDest.  A 
10b70 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65  LIMIT of zero me
10b80 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f  ans to output no
10b90 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e   rows and a.** n
10ba0 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65  egative LIMIT me
10bb0 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c  ans to output al
10bc0 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72  l rows.  If ther
10bd0 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46  e is also an OFF
10be0 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69  SET clause.** wi
10bf0 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  th a positive va
10c00 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  lue, then the fi
10c10 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75  rst OFFSET outpu
10c20 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64  ts are discarded
10c30 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20   rather.** than 
10c40 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44  being sent to pD
10c50 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20  est.  The LIMIT 
10c60 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62  count does not b
10c70 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72  egin until after
10c80 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20   OFFSET.** rows 
10c90 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
10ca0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
10cb0 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65  d generateWithRe
10cc0 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20  cursiveQuery(.  
10cd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10ce0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10cf0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
10d00 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
10d10 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72      /* The recur
10d20 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62  sive SELECT to b
10d30 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
10d40 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
10d50 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
10d60 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
10d70 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  lts */.){.  SrcL
10d80 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
10d90 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
10da0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
10db0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75  the recursive qu
10dc0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ery */.  int nCo
10dd0 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
10de0 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  Expr;  /* Number
10df0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
10e00 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62  he recursive tab
10e10 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  le */.  Vdbe *v 
10e20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10e30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
10e40 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
10e50 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
10e60 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
10e70 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69  pSetup = p->pPri
10e80 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74  or;   /* The set
10e90 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  up query */.  in
10ea0 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10ec0 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  op of the loop *
10ed0 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
10ee0 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20  , addrBreak;    
10ef0 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e    /* CONTINUE an
10f00 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65  d BREAK addresse
10f10 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72  s */.  int iCurr
10f20 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
10f30 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72       /* The Curr
10f40 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
10f50 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20  nt regCurrent;  
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f70 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
10f80 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
10f90 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20  /.  int iQueue; 
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74    /* The Queue t
10fc0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  able */.  int iD
10fd0 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20  istinct = 0;    
10fe0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e          /* To en
10ff0 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75  sure unique resu
11000 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a  lts if UNION */.
11010 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52    int eDest = SR
11020 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20  T_Fifo;         
11030 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20  /* How to write 
11040 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65  to Queue */.  Se
11050 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65  lectDest destQue
11060 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ue;         /* S
11070 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74  electDest target
11080 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74  ting the Queue t
11090 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
110c0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
110d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
110e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
110f0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45  sult code */.  E
11100 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
11110 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
11120 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
11130 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
11140 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
11150 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
11160 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11170 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
11180 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20  it, regOffset;  
11190 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
111a0 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61   used by LIMIT a
111b0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20  nd OFFSET */..  
111c0 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72  /* Obtain author
111d0 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20  ization to do a 
111e0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
111f0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
11200 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
11210 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  , SQLITE_RECURSI
11220 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  VE, 0, 0, 0) ) r
11230 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f  eturn;..  /* Pro
11240 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61  cess the LIMIT a
11250 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
11260 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74  s, if they exist
11270 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20   */.  addrBreak 
11280 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
11290 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
112a0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
112b0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64  rs(pParse, p, ad
112c0 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d  drBreak);.  pLim
112d0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
112e0 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
112f0 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d  Offset;.  regLim
11300 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
11310 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d    regOffset = p-
11320 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70  >iOffset;.  p->p
11330 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73  Limit = p->pOffs
11340 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  et = 0;.  p->iLi
11350 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
11360 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
11370 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
11380 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
11390 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
113a0 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
113b0 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
113c0 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
113d0 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
113e0 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
113f0 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
11400 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
11410 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
11420 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
11430 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
11440 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
11450 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
11460 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
11470 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
11480 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
11490 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
114a0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
114b0 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
114c0 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
114d0 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
114e0 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
114f0 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
11500 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
11510 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
11520 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
11530 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
11540 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
11550 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
11560 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
11570 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
11580 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
11590 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
115a0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
115b0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
115c0 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
115d0 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
115e0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
115f0 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
11600 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
11610 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
11620 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
11630 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
11640 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
11650 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
11660 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
11670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11680 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
11690 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
116a0 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
116b0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
116c0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
116d0 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
116e0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
116f0 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
11700 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11710 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
11720 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
11730 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
11740 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
11770 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
11780 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
11790 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
117a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
117b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
117c0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
117d0 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
117e0 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
117f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
11800 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
11810 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
11820 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
11830 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
11840 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11850 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
11860 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
11870 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
11880 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
11890 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
118a0 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
118b0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
118c0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
118d0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
118e0 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
118f0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
11900 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
11910 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
11920 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
11930 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
11940 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11950 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75   pSetup, &destQu
11960 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e  eue);.  pSetup->
11970 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28  pNext = p;.  if(
11980 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f   rc ) goto end_o
11990 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
119a0 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  y;..  /* Find th
119b0 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68  e next row in th
119c0 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70  e Queue and outp
119d0 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20  ut that row */. 
119e0 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
119f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11a00 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75  OP_Rewind, iQueu
11a10 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  e, addrBreak); V
11a20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
11a30 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74  .  /* Transfer t
11a40 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51  he next row in Q
11a50 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72  ueue over to Cur
11a60 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rent */.  sqlite
11a70 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11a80 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72  P_NullRow, iCurr
11a90 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65  ent); /* To rese
11aa0 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a  t column cache *
11ab0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
11ac0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11ad0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11ae0 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20  Column, iQueue, 
11af0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
11b00 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  1, regCurrent);.
11b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
11b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11b30 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51  , OP_RowData, iQ
11b40 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74  ueue, regCurrent
11b50 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11b60 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11b70 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29  _Delete, iQueue)
11b80 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
11b90 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
11ba0 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64   Current */.  ad
11bb0 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
11bc0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11bd0 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  ;.  codeOffset(v
11be0 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64  , regOffset, add
11bf0 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74  rCont);.  select
11c00 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
11c10 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
11c20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
11c30 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
11c40 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
11c50 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
11c60 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
11c70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11c80 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72  _DecrJumpZero, r
11c90 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
11ca0 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
11cb0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
11cc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11cd0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
11ce0 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63  ont);..  /* Exec
11cf0 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
11d00 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20  e SELECT taking 
11d10 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
11d20 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a  n Current as.  *
11d30 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * the value for 
11d40 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
11d50 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72  ble. Store the r
11d60 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75  esults in the Qu
11d70 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eue..  */.  if( 
11d80 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
11d90 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
11da0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11db0 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72  g(pParse, "recur
11dc0 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71  sive aggregate q
11dd0 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f  ueries not suppo
11de0 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  rted");.  }else{
11df0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
11e00 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
11e10 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
11e20 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
11e30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
11e40 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ior==0 );.    p-
11e50 3e 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70  >pPrior = pSetup
11e60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70  ;.  }..  /* Keep
11e70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f   running the loo
11e80 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75  p until the Queu
11e90 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  e is empty */.  
11ea0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
11eb0 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
11ec0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11ed0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
11ee0 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65  eak);..end_of_re
11ef0 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20  cursive_query:. 
11f00 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11f10 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
11f20 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
11f30 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
11f40 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e   pOrderBy;.  p->
11f50 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
11f60 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
11f70 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72  pOffset;.  retur
11f80 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
11f90 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
11fa0 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
11fb0 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74  ferences */.stat
11fc0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
11fd0 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
11fe0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11ff0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12000 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12010 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12020 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
12030 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
12040 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
12050 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
12060 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
12070 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
12080 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  sults */.);../*.
12090 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70  ** Handle the sp
120a0 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
120b0 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
120c0 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
120d0 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53  from a.** VALUES
120e0 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e   clause.  By han
120f0 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61 20  dling this as a 
12100 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65  special case, we
12110 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72   avoid deep.** r
12120 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68  ecursion, and th
12130 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  us do not need t
12140 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51  o enforce the SQ
12150 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
12160 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e  UND_SELECT.** on
12170 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
12180 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20  ..**.** Because 
12190 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
121a0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
121b0 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  m a VALUES claus
121c0 65 3a 0a 2a 2a 20 20 20 28 31 29 20 49 74 20 68  e:.**   (1) It h
121d0 61 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f  as no LIMIT or O
121e0 46 46 53 45 54 0a 2a 2a 20 20 20 28 32 29 20 41  FFSET.**   (2) A
121f0 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 55 4e 49  ll terms are UNI
12200 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20  ON ALL.**   (3) 
12210 54 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  There is no ORDE
12220 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73  R BY clause.*/.s
12230 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
12240 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50  electValues(.  P
12250 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12260 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
12270 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
12280 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
12290 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
122a0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
122b0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
122c0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
122d0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
122e0 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
122f0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
12300 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a  Select *pPrior;.
12310 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a    int nRow = 1;.
12320 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
12330 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
12340 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
12350 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  lue );.  do{.   
12360 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
12370 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
12380 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12390 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  p->op==TK_ALL ||
123a0 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   (p->op==TK_SELE
123b0 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d  CT && p->pPrior=
123c0 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
123d0 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
123e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
123f0 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a  ->pOffset==0 );.
12400 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12410 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45  Next==0 || p->pE
12420 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e  List->nExpr==p->
12430 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pNext->pEList->n
12440 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20  Expr );.    if( 
12450 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62  p->pPrior==0 ) b
12460 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
12470 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  ( p->pPrior->pNe
12480 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d  xt==p );.    p =
12490 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
124a0 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  nRow++;.  }while
124b0 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  (1);.  while( p 
124c0 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  ){.    pPrior = 
124d0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
124e0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
124f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
12500 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
12510 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  pDest);.    p->p
12520 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
12530 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
12540 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ak;.    p->nSele
12550 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20  ctRow = nRow;.  
12560 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
12570 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
12590 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
125a0 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
125b0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
125c0 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
125d0 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
125e0 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
125f0 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
12600 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
12610 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
12620 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
12630 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
12640 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
12650 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
12660 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
12670 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
12680 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
12690 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
126a0 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
126b0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
126c0 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
126d0 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
126e0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
126f0 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
12700 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
12710 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
12720 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
12730 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
12740 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
12750 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
12760 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
12770 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
12780 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
12790 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
127a0 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
127b0 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
127c0 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
127d0 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
127e0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
127f0 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
12800 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
12810 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
12820 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
12830 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
12840 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12860 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
12870 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
12880 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
12890 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
128a0 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
128b0 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
128c0 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
128d0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
128e0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
128f0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
12900 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
12910 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
12920 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
12930 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
12940 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
12950 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
12960 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
12970 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
12980 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
12990 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
129a0 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
129b0 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
129c0 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
129d0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
129e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
129f0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
12a00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12a10 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
12a20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
12a30 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
12a40 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
12a50 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
12a60 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
12a70 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
12a80 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
12a90 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
12aa0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
12ab0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12ac0 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
12ad0 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
12ae0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
12af0 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
12b00 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
12b10 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
12b20 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
12b30 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
12b40 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
12b50 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
12b60 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
12b70 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
12b80 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
12b90 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
12ba0 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
12bb0 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
12bc0 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
12bd0 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
12be0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
12bf0 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
12c00 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
12c10 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ion */.#ifndef S
12c20 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
12c30 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d  IN.  int iSub1 =
12c40 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
12c50 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e  P id of left-han
12c60 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
12c70 20 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20   iSub2 = 0;     
12c80 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
12c90 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79  right-hand query
12ca0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   */.#endif..  /*
12cb0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
12cc0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
12cd0 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
12ce0 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
12cf0 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
12d00 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
12d10 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
12d20 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
12d30 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
12d40 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73  LIMIT..  */.  as
12d50 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50  sert( p && p->pP
12d60 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c  rior );  /* Call
12d70 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61  ing function gua
12d80 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63  rantees this muc
12d90 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  h */.  assert( (
12da0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
12db0 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c  _Recursive)==0 |
12dc0 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  | p->op==TK_ALL 
12dd0 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  || p->op==TK_UNI
12de0 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  ON );.  db = pPa
12df0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
12e00 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
12e10 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
12e20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
12e30 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
12e40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12e50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
12e60 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
12e70 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
12e80 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
12e90 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
12ea0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
12eb0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
12ec0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
12ed0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
12ee0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
12ef0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12f00 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
12f10 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
12f20 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
12f30 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
12f40 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
12f50 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
12f60 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
12f70 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
12f80 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12f90 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
12fa0 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
12fb0 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
12fc0 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
12fd0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
12fe0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
12ff0 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
13000 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
13010 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
13020 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
13030 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
13040 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
13050 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
13060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13070 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
13080 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  l, dest.iSDParm,
13090 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
130a0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
130b0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
130c0 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
130d0 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
130e0 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
130f0 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68  ..  /* Special h
13100 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f  andling for a co
13110 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
13120 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73  at originates as
13130 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
13140 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13150 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75  selFlags & SF_Mu
13160 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  ltiValue ){.    
13170 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
13180 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70  Values(pParse, p
13190 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f  , &dest);.    go
131a0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
131b0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
131c0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
131d0 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
131e0 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
131f0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
13200 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
13210 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
13220 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13230 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
13240 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
13250 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13260 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69  ist->nExpr==pPri
13270 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
13280 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  r );..#ifndef SQ
13290 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
132a0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
132b0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
132c0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
132d0 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
132e0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
132f0 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
13300 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
13310 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
13320 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
13330 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
13340 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
13350 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
13360 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
13370 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
13380 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
13390 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
133a0 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  e..  /* Generate
133b0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
133c0 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
133d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
133e0 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
133f0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
13400 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
13410 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
13420 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
13430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
13440 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
13450 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
13460 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  iLimit = p->iLim
13470 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
13480 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
13490 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50  Offset;.      pP
134a0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
134b0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
134c0 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
134d0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
134e0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
134f0 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
13500 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13510 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
13520 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13530 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
13540 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
13550 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
13560 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
13570 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
13580 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
13590 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
135a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
135b0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
135c0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
135d0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
135e0 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
135f0 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
13600 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
13610 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
13620 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
13630 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13640 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69  _IfNot, p->iLimi
13650 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
13660 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
13670 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
13680 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
13690 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
136a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66        if( p->iOf
136b0 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
136c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
136d0 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 49 66 4e  Op3(v, OP_SetIfN
136e0 6f 74 50 6f 73 2c 20 70 2d 3e 69 4f 66 66 73 65  otPos, p->iOffse
136f0 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30  t, p->iOffset, 0
13700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13710 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13720 2c 20 4f 50 5f 41 64 64 2c 20 70 2d 3e 69 4c 69  , OP_Add, p->iLi
13730 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  mit, p->iOffset,
13740 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 29 3b 0a   p->iOffset+1);.
13750 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13760 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13770 50 5f 53 65 74 49 66 4e 6f 74 50 6f 73 2c 20 70  P_SetIfNotPos, p
13780 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
13790 66 73 65 74 2b 31 2c 20 2d 31 29 3b 0a 20 20 20  fset+1, -1);.   
137a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
137b0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
137c0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
137d0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
137e0 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
137f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13800 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
13810 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13830 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
13840 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
13850 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13860 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
13870 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70  >nSelectRow += p
13880 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
13890 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  w;.      if( pPr
138a0 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20  ior->pLimit.    
138b0 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
138c0 72 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f  rIsInteger(pPrio
138d0 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d  r->pLimit, &nLim
138e0 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c  it).       && nL
138f0 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65  imit>0 && p->nSe
13900 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e  lectRow > (u64)n
13910 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a  Limit .      ){.
13920 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
13930 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a  ctRow = nLimit;.
13940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13950 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
13960 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13970 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
13980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
13990 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
139a0 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
139b0 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
139c0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
139d0 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
139e0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
139f0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
13a00 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
13a10 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70  t */.      u8 op
13a20 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
13a30 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
13a40 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
13a50 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
13a60 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
13a70 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
13a80 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
13a90 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
13aa0 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
13ab0 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
13ac0 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
13ad0 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
13ae0 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
13af0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
13b00 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
13b10 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
13b20 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
13b30 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
13b40 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  PT );.      test
13b50 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
13b60 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  UNION );.      p
13b70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69  riorOp = SRT_Uni
13b80 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65  on;.      if( de
13b90 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  st.eDest==priorO
13ba0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  p ){.        /* 
13bb0 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
13bc0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
13bd0 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
13be0 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
13bf0 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
13c00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13c10 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
13c20 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  it==0 );      /*
13c30 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
13c40 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
13c50 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
13c60 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
13c70 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  =0 );     /* Not
13c80 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
13c90 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
13ca0 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
13cb0 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  b = dest.iSDParm
13cc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13cd0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
13ce0 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
13cf0 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
13d00 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
13d10 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
13d20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
13d30 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
13d40 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
13d50 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
13d60 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
13d70 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
13d80 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
13d90 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13da0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
13db0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
13dc0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
13dd0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
13de0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
13df0 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
13e00 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
13e10 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
13e20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
13e30 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
13e40 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
13e50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13e60 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
13e70 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13e80 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
13e90 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
13ea0 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
13eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
13ec0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
13ed0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13ee0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
13ef0 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
13f00 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
13f10 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
13f20 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
13f30 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
13f40 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
13f50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13f60 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
13f70 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
13f80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
13f90 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
13fa0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
13fb0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
13fc0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
13fd0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
13fe0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13ff0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
14000 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  PT ){.        op
14010 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20   = SRT_Except;. 
14020 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14030 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
14040 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
14050 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
14060 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  Union;.      }. 
14070 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14080 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
14090 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
140a0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
140b0 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
140c0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
140d0 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
140e0 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e  = 0;.      union
140f0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
14100 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
14110 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
14120 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14130 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
14140 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
14150 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
14160 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ondest);.      t
14170 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14180 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
14190 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
141a0 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
141b0 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
141c0 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
141d0 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
141e0 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
141f0 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
14200 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
14210 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
14220 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14230 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
14240 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
14250 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
14260 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
14270 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
14280 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
14290 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
142a0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
142b0 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ON ) p->nSelectR
142c0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
142d0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
142e0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
142f0 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
14300 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14310 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
14320 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
14330 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
14340 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
14350 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
14360 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  0;..      /* Con
14370 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
14380 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
14390 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
143a0 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
143b0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
143c0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
143d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
143e0 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
143f0 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
14400 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
14410 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  rOp );.      if(
14420 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
14430 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
14440 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
14450 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
14460 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
14470 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
14480 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
14490 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
144a0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
144b0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
144c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
144d0 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
144e0 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
144f0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
14500 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
14510 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
14520 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
14530 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14540 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
14550 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14560 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
14570 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
14580 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
14590 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
145a0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
145b0 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
145c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
145d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
145e0 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
145f0 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
14600 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14610 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
14620 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14630 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
14640 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
14650 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
14660 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a  List, unionTab,.
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14680 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
14690 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
146a0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
146b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
146c0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
146d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
146e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
146f0 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
14700 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
14710 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
14720 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14730 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
14740 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
14750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14760 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
14770 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
14780 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14790 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
147a0 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
147b0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
147c0 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
147d0 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
147e0 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
147f0 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
14800 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
14810 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
14820 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
14830 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
14840 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
14850 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
14860 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
14870 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
14880 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
14890 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
148a0 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
148b0 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
148c0 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
148d0 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
148e0 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
148f0 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
14900 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
14910 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
14920 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14930 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
14940 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14960 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
14970 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
14980 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14990 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
149a0 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
149b0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
149c0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
149d0 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
149e0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
149f0 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66   = addr;.      f
14a00 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
14a10 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
14a20 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
14a30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14a40 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
14a50 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
14a60 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
14a70 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
14a80 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
14a90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
14aa0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14ab0 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
14ac0 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
14ad0 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  b1);.      expla
14ae0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14af0 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
14b00 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14b10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14b20 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14b30 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
14b40 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
14b50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
14b60 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
14b70 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
14b80 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
14b90 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
14ba0 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
14bb0 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
14bc0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
14bd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14be0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14bf0 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
14c00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14c10 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14c20 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
14c30 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
14c40 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
14c50 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
14c60 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
14c70 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
14c80 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
14c90 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
14ca0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
14cb0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
14cc0 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
14cd0 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
14ce0 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70   tab2;.      exp
14cf0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14d00 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
14d10 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
14d20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14d30 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14d40 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
14d50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14d60 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
14d70 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
14d80 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
14d90 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14da0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
14db0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
14dc0 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
14dd0 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
14de0 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
14df0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
14e00 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14e10 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
14e20 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14e30 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
14e40 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
14e50 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f  Offset;..      /
14e60 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14e70 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
14e80 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
14e90 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
14ea0 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
14eb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
14ec0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
14ed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
14ee0 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
14ef0 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53  put ){.        S
14f00 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
14f10 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  p;.        while
14f20 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
14f30 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
14f40 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
14f50 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
14f60 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
14f70 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
14f80 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
14f90 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
14fa0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14fb0 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
14fc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14fd0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
14fe0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
14ff0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
15000 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
15010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15020 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
15030 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20   tab1, iBreak); 
15040 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15050 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
15060 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15070 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74  arse);.      iSt
15080 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
15090 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
150a0 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b  wKey, tab1, r1);
150b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
150c0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
150d0 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
150e0 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b  , iCont, r1, 0);
150f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
15110 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15120 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
15130 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
15140 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
15150 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20  EList, tab1,.   
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
15180 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
15190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
151a0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
151b0 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
151c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
151d0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
151e0 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  1, iStart); Vdbe
151f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
15210 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
15220 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
15230 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15240 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
15250 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
15260 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15270 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
15280 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
15290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
152a0 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
152b0 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
152c0 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
152d0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
152e0 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
152f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
15300 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
15310 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
15320 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
15330 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
15340 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
15350 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
15360 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
15370 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
15380 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
15390 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
153a0 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
153b0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
153c0 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
153d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
153e0 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
153f0 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
15400 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
15410 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
15420 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
15430 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
15440 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
15450 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
15460 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
15470 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
15480 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
15490 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
154a0 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
154b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
154c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
154d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
154e0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
154f0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
15500 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
15510 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
15520 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
15530 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15550 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
15560 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
15570 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
15580 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
15590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
155a0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
155b0 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
155c0 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
155d0 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
155e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
155f0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
15600 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
15610 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15620 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
15630 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
15640 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
15650 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
15660 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
15670 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
15680 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
15690 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
156a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
156b0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
156c0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  end;.    }.    f
156d0 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
156e0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
156f0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
15700 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
15710 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
15720 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
15730 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
15740 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
15750 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
15760 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
15770 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
15780 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
15790 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
157a0 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
157b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
157c0 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
157d0 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
157e0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
157f0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
15800 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
15810 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
15820 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
15830 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
15840 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
15850 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
15860 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
15870 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
15880 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
15890 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
158a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
158b0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
158c0 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
158d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
158e0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
158f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
15900 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
15910 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15920 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
15930 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ddr, (char*)sqli
15940 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
15950 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  eyInfo),.       
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
15980 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
15990 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
159a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
159b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
159c0 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
159d0 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
159e0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
159f0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
15a00 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44  dest.iSdst;.  pD
15a10 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73  est->nSdst = des
15a20 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74  t.nSdst;.  sqlit
15a30 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
15a40 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
15a50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
15a60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15a70 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
15a80 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f  T */../*.** Erro
15a90 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68  r message for wh
15aa0 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  en two or more t
15ab0 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75  erms of a compou
15ac0 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64  nd select have d
15ad0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65  ifferent.** size
15ae0 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f   result sets..*/
15af0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
15b00 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73  ectWrongNumTerms
15b10 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
15b20 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
15b30 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
15b40 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
15b50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15b60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
15b70 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68  ll VALUES must h
15b80 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
15b90 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a  ber of terms");.
15ba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
15bb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15bc0 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
15bd0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
15be0 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
15bf0 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
15c00 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
15c10 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
15c20 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
15c30 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  p->op));.  }.}..
15c40 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75  /*.** Code an ou
15c50 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
15c60 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  for a coroutine 
15c70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
15c80 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
15c90 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  atment..**.** Th
15ca0 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74  e data to be out
15cb0 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  put is contained
15cc0 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20   in pIn->iSdst. 
15cd0 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
15ce0 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73  n->nSdst columns
15cf0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
15d00 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
15d10 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
15d20 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
15d30 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
15d40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
15d50 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
15d60 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
15d70 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
15d80 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
15d90 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
15da0 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67  is the first reg
15db0 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f  ister in a vecto
15dc0 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64  r that.** record
15dd0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  s the previous o
15de0 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50  utput.  mem[regP
15df0 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74  rev] is a flag t
15e00 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20  hat is false.** 
15e10 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
15e20 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75  n no previous ou
15e30 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65  tput.  If regPre
15e40 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  v>0 then code is
15e50 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f  .** generated to
15e60 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   suppress duplic
15e70 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20  ates.  pKeyInfo 
15e80 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70  is used for comp
15e90 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a  aring.** keys..*
15ea0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49  *.** If the LIMI
15eb0 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c  T found in p->iL
15ec0 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
15ed0 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
15ee0 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a  y to.** iBreak..
15ef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
15f00 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
15f10 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20  outine(.  Parse 
15f20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15f30 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
15f40 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
15f50 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15f60 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
15f70 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
15f80 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20  electDest *pIn, 
15f90 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74         /* Corout
15fa0 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61  ine supplying da
15fb0 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
15fc0 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
15fd0 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64  /* Where to send
15fe0 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   the data */.  i
15ff0 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20  nt regReturn,   
16000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
16010 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
16020 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
16030 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  egPrev,         
16040 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
16050 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20  esult register. 
16060 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69   No uniqueness i
16070 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  f 0 */.  KeyInfo
16080 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
16090 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e   /* For comparin
160a0 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  g with previous 
160b0 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
160c0 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
160d0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
160e0 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
160f0 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
16100 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
16110 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
16120 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
16130 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
16140 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16150 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
16160 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
16170 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
16180 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
16190 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
161a0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
161b0 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
161c0 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
161d0 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
161e0 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20  ddr2;.    addr1 
161f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16200 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
16210 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43   regPrev); VdbeC
16220 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
16230 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
16240 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16250 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
16260 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
16270 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16290 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
162a0 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
162b0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
162c0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
162d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
162e0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
162f0 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  r2+2, iContinue,
16300 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43   addr2+2); VdbeC
16310 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
16320 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
16330 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
16340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16350 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
16360 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
16370 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
16380 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
16390 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
163a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
163b0 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
163c0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
163d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
163e0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
163f0 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
16400 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
16410 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
16420 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
16430 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
16440 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
16450 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73  ontinue);..  ass
16460 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
16470 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b  t!=SRT_Exists );
16480 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
16490 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  ->eDest!=SRT_Tab
164a0 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  le );.  switch( 
164b0 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
164c0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
164d0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
164e0 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
164f0 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
16500 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
16510 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
16520 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16530 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16540 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
16550 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16560 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      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 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
16590 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
165a0 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
165b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
165c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
165d0 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
165e0 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
165f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16600 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
16610 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16620 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
16630 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16640 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
16650 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
16660 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16670 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
16680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16690 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
166a0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
166b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
166c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
166d0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
166e0 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
166f0 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
16700 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
16710 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
16720 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
16730 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
16740 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
16750 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
16760 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
16770 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
16780 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
16790 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
167a0 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
167b0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
167c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
167d0 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
167e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
167f0 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
16800 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20  ffSdst = .      
16810 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
16820 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
16830 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
16840 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
16850 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
16860 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16870 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
16880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16890 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
168a0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c  , pIn->iSdst, 1,
168b0 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66   r1, &pDest->aff
168c0 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73  Sdst,1);.      s
168d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
168e0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
168f0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
16900 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
16910 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16920 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
16930 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
16940 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16950 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16960 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
16970 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16980 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16990 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
169a0 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
169b0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
169c0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
169d0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
169e0 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
169f0 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
16a00 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
16a10 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
16a20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
16a30 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
16a40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16a50 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
16a60 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
16a70 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e  ;  testcase( pIn
16a80 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20  ->nSdst!=1 );.  
16a90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16aa0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
16ab0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
16ac0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a  t->iSDParm, 1);.
16ad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
16ae0 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
16af0 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
16b00 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
16b10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16b20 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
16b30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16b40 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
16b50 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
16b60 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
16b70 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
16b80 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
16b90 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
16ba0 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
16bb0 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
16bc0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
16bd0 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
16be0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
16bf0 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
16c00 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16c10 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
16c20 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
16c30 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
16c40 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16c50 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
16c60 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
16c70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16c80 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16c90 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
16ca0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16cb0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
16cc0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16cd0 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
16ce0 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
16cf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16d00 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
16d10 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
16d20 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
16d30 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
16d40 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
16d50 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
16d60 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
16d70 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
16d80 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
16d90 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
16da0 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
16db0 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
16dc0 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
16dd0 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
16de0 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
16df0 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
16e00 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
16e10 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
16e20 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
16e30 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
16e40 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
16e50 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
16e60 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
16e70 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
16e80 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
16e90 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
16ea0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
16eb0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
16ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16ed0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16ee0 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
16ef0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16f00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16f10 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
16f20 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
16f30 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16f40 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72  nSdst);.      br
16f50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
16f60 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
16f70 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
16f80 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
16f90 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
16fa0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
16fb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16fc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
16fd0 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69  crJumpZero, p->i
16fe0 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
16ff0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17000 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
17010 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
17020 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
17030 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
17040 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
17050 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
17060 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17070 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
17080 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
17090 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
170a0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
170b0 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
170c0 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
170d0 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
170e0 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
170f0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
17100 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
17110 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17120 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
17130 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
17140 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
17150 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
17160 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
17170 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
17180 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
17190 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
171a0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
171b0 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
171c0 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
171d0 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
171e0 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
171f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
17200 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
17210 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
17220 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
17230 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
17240 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
17250 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
17260 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
17270 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
17280 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
17290 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
172a0 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
172b0 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
172c0 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
172d0 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
172e0 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
172f0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
17300 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
17310 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
17320 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
17330 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
17340 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
17350 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
17360 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
17370 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
17380 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
17390 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
173a0 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
173b0 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
173c0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
173d0 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
173e0 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
173f0 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
17400 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
17410 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
17420 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
17430 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
17440 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
17450 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
17460 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
17470 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
17480 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17490 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
174a0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
174b0 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
174c0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
174d0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
174e0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
174f0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
17500 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
17510 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
17520 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
17530 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
17540 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
17550 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
17560 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
17570 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
17580 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
17590 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
175a0 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
175b0 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
175c0 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
175d0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
175e0 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
175f0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
17600 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
17610 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
17620 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
17630 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
17640 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
17650 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17660 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
17670 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
17680 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
17690 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
176a0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
176b0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
176c0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
176d0 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
176e0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
176f0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
17700 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
17710 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
17720 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
17730 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
17740 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
17750 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
17760 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
17770 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
17780 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17790 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
177a0 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
177b0 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
177c0 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
177d0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
177e0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
177f0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
17800 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
17810 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
17820 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
17830 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
17840 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
17850 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
17860 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
17870 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
17880 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
17890 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
178a0 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
178b0 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
178c0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
178d0 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
178e0 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
178f0 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
17900 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
17910 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
17920 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
17930 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
17940 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
17950 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
17960 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
17970 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
17980 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
17990 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
179a0 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
179b0 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
179c0 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
179d0 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
179e0 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
179f0 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
17a00 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
17a10 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
17a20 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
17a30 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
17a40 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
17a50 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
17a60 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
17a70 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
17a80 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
17a90 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
17aa0 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
17ab0 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
17ac0 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
17ad0 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
17ae0 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
17af0 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
17b00 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
17b10 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
17b20 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
17b30 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
17b40 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
17b50 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
17b60 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
17b70 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
17b80 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
17b90 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
17ba0 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
17bb0 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
17bc0 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
17bd0 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
17be0 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
17bf0 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
17c00 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
17c10 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
17c20 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
17c30 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
17c40 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
17c50 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
17c60 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
17c70 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
17c80 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
17c90 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
17ca0 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
17cb0 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
17cc0 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
17cd0 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
17ce0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
17cf0 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
17d00 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
17d10 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
17d20 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
17d30 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
17d40 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
17d50 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
17d60 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
17d70 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
17d80 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
17d90 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
17da0 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
17db0 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
17dc0 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
17dd0 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
17de0 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
17df0 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
17e00 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17e10 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
17e20 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
17e30 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
17e40 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
17e50 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
17e60 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
17e70 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
17e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17e90 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
17ea0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
17eb0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
17ec0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
17ed0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
17ee0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
17ef0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
17f00 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
17f10 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
17f20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
17f30 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
17f40 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
17f50 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
17f60 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
17f70 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
17f80 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17f90 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
17fa0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
17fb0 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
17fc0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
17fd0 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
17fe0 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
17ff0 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
18000 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
18010 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
18020 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
18030 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
18040 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
18050 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18060 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
18070 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
18080 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
18090 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
180a0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
180b0 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
180c0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
180d0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
180e0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
180f0 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
18100 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
18110 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
18120 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
18130 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18140 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
18150 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
18160 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18170 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
18180 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
18190 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
181a0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
181b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
181c0 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
181d0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
181e0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
181f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18200 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
18210 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18220 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
18230 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18240 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
18250 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18260 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
18270 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
18280 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
18290 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41  fA_noB;     /* A
182a0 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66  lternate addrEof
182b0 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74  A if B is uninit
182c0 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74  ialized */.  int
182d0 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
182e0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
182f0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
18300 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
18310 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18320 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
18330 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18340 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
18350 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
18360 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18370 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
18380 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18390 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
183a0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
183b0 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
183c0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
183d0 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
183e0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
183f0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
18400 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
18410 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
18420 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
18430 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
18440 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
18450 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
18460 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
18470 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
18480 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
18490 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
184a0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
184b0 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
184c0 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
184d0 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
184e0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
184f0 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
18500 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
18510 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
18520 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
18530 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
18540 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
18550 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
18560 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
18570 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
18580 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
18590 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
185a0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
185b0 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
185c0 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
185d0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
185e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
185f0 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
18600 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
18610 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
18620 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
18630 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
18640 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
18650 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
18660 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
18670 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
18680 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
18690 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
186a0 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
186b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
186c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
186d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
186e0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
186f0 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
18700 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18710 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
18720 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
18730 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
18740 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
18750 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
18760 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
18770 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
18780 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
18790 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
187a0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
187b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
187c0 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
187d0 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
187e0 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
187f0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
18800 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
18810 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
18820 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
18830 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
18840 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
18850 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
18860 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
18870 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
18880 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
18890 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
188a0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
188b0 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
188c0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
188d0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
188e0 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
188f0 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
18900 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
18910 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
18920 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
18930 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18940 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
18950 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18960 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
18970 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
18980 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
18990 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
189a0 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
189b0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
189c0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
189d0 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
189e0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
189f0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
18a00 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
18a10 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
18a20 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
18a30 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
18a40 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
18a50 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
18a60 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
18a70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
18a80 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
18a90 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
18aa0 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
18ab0 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
18ac0 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
18ad0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
18ae0 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
18af0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
18b00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
18b10 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
18b20 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
18b30 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
18b40 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
18b50 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
18b60 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
18b70 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
18b80 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
18b90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18ba0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
18bb0 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
18bc0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
18bd0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
18be0 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
18bf0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
18c00 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
18c10 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
18c20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
18c30 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
18c40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
18c50 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
18c60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18c70 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
18c80 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
18c90 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
18ca0 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
18cb0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
18cc0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
18cd0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
18ce0 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
18cf0 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
18d00 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
18d10 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
18d20 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
18d30 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
18d40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18d50 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
18d60 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
18d70 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
18d80 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
18d90 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
18da0 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
18db0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
18dc0 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
18dd0 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
18de0 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
18df0 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
18e00 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
18e10 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
18e20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18e30 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
18e40 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
18e50 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
18e60 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
18e70 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
18e80 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
18e90 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
18ea0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
18eb0 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
18ec0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
18ed0 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
18ee0 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
18ef0 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
18f00 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
18f10 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
18f20 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
18f30 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
18f40 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
18f50 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
18f60 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18f70 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
18f80 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
18f90 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18fa0 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
18fb0 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
18fc0 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
18fd0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18fe0 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
18ff0 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75    pKeyMerge = mu
19000 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
19010 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
19020 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p, 1);.  }else{.
19030 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
19040 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
19050 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
19060 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
19070 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
19080 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
19090 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
190a0 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
190b0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
190c0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
190d0 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
190e0 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
190f0 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
19100 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
19110 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
19120 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
19130 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
19140 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
19150 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
19160 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
19170 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
19180 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
19190 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
191a0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
191b0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
191c0 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
191d0 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
191e0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
191f0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
19200 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
19210 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
19220 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
19230 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
19240 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
19250 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31  >nMem += nExpr+1
19260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19270 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
19280 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
19290 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
192a0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
192b0 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c  Alloc(db, nExpr,
192c0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65   1);.    if( pKe
192d0 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73  yDup ){.      as
192e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
192f0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
19300 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20  pKeyDup) );.    
19310 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
19320 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
19330 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
19340 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
19350 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
19360 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
19370 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
19380 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
19390 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
193a0 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
193b0 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
193c0 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
193d0 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
193e0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
193f0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
19400 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
19410 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
19420 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
19430 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
19440 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
19450 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
19460 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
19470 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
19480 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
19490 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
194a0 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
194b0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
194c0 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
194d0 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
194e0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
194f0 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
19500 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
19510 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
19520 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
19530 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
19540 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
19550 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
19560 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
19570 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19580 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
19590 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
195a0 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
195d0 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
195e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
195f0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
19600 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
19610 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
19620 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
19630 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
19640 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
19650 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
19660 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
19670 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
19680 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
19690 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70  pOffset);.  p->p
196a0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72  Offset = 0;..  r
196b0 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
196c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
196d0 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
196e0 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
196f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
19700 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
19710 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
19720 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
19730 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
19740 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
19750 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
19760 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
19770 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
19780 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
19790 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
197a0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
197b0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
197c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
197d0 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
197e0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
197f0 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
19800 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
19810 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
19820 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19830 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
19840 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
19850 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19860 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
19870 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64  regAddrA, 0, add
19880 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62  rSelectA);.  Vdb
19890 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65  eComment((v, "le
198a0 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
198b0 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
198c0 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78   regLimitA;.  ex
198d0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
198e0 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
198f0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
19900 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
19910 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
19920 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
19930 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
19940 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  P_EndCoroutine, 
19950 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
19960 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
19970 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f  (v, addr1);..  /
19980 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
19990 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
199a0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
199b0 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
199c0 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
199d0 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
199e0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
199f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19a00 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
19a10 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
19a20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19a30 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
19a40 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
19a50 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
19a60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
19a70 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
19a80 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
19a90 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
19aa0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
19ab0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
19ac0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
19ad0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
19ae0 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
19af0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
19b00 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
19b10 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
19b20 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
19b30 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
19b40 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
19b50 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
19b60 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
19b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19b80 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
19b90 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
19ba0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
19bb0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19bc0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
19bd0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
19be0 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
19bf0 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
19c00 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
19c10 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
19c20 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
19c30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
19c40 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
19c50 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
19c60 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
19c70 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
19c80 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19c90 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
19ca0 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
19cd0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
19ce0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19cf0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
19d00 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
19d10 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
19d20 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
19d30 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
19d40 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
19d50 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
19d60 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
19d70 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
19d80 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
19d90 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
19da0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
19db0 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
19dc0 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
19dd0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
19de0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
19df0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
19e00 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
19e10 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
19e20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
19e30 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
19e40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
19e50 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
19e60 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
19e70 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19e80 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
19e90 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19ea0 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
19eb0 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19ec0 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19ed0 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
19ee0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  /.  if( op==TK_E
19ef0 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
19f00 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
19f10 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
19f20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c  addrEofA = label
19f30 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
19f40 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
19f50 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
19f60 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
19f70 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
19f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19f90 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
19fa0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
19fb0 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
19fc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19fd0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19fe0 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65  , regAddrB, labe
19ff0 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  lEnd);.         
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
1a020 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a030 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1a040 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  (v, addrEofA);. 
1a050 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
1a060 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
1a070 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  ectRow;.  }..  /
1a080 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1a090 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1a0a0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1a0b0 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
1a0c0 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1a0d0 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1a0e0 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
1a0f0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1a100 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1a110 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
1a120 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
1a130 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
1a140 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
1a150 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
1a160 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
1a170 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
1a180 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1a190 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1a1a0 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
1a1b0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1a1c0 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
1a1d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1a1e0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1a1f0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
1a200 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a210 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a220 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20  drA, labelEnd); 
1a230 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a240 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a250 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42  Goto(v, addrEofB
1a260 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1a270 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1a280 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1a290 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
1a2a0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1a2b0 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
1a2c0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
1a2d0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1a2e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1a2f0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1a300 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
1a310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a320 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a330 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1a340 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a350 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1a360 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1a370 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1a380 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1a390 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
1a3a0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1a3b0 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
1a3c0 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1a3d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1a3e0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1a3f0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1a400 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
1a410 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
1a420 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1a430 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
1a440 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1a450 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
1a460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a470 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a480 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1a490 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1a4a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1a4b0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1a4c0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
1a4d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1a4e0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1a4f0 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
1a500 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1a510 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
1a520 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1a530 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
1a540 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a550 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
1a560 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1a570 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1a580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a590 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1a5a0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1a5b0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1a5c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a5d0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1a5e0 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1a5f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a600 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1a610 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1a620 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
1a630 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
1a640 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
1a650 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
1a660 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1a670 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
1a680 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a690 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a6a0 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  rA, addrEofA_noB
1a6b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a6c0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1a6d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a6e0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1a6f0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1a700 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1a710 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d   Implement the m
1a720 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20  ain merge loop. 
1a730 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1a740 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a750 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73   labelCmpr);.  s
1a760 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a770 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  (v, OP_Permutati
1a780 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  on, 0, 0, 0, (ch
1a790 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34  ar*)aPermute, P4
1a7a0 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71  _INTARRAY);.  sq
1a7b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a7c0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64  v, OP_Compare, d
1a7d0 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74  estA.iSdst, dest
1a7e0 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42  B.iSdst, nOrderB
1a7f0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1a800 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1a810 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
1a820 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
1a830 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1a840 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  (v, OPFLAG_PERMU
1a850 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TE);.  sqlite3Vd
1a860 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
1a870 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
1a880 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
1a890 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1a8a0 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  (v);..  /* Jump 
1a8b0 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
1a8c0 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
1a8d0 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
1a8e0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1a8f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1a900 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
1a910 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
1a920 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
1a930 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
1a940 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
1a950 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
1a960 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
1a970 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77   = pPrior;.    w
1a980 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
1a990 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
1a9a0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
1a9b0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
1a9c0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
1a9d0 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
1a9e0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  t);.  }..  /* Re
1a9f0 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
1aa00 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
1aa10 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
1aa20 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
1aa30 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
1aa40 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
1aa50 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1aa60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
1aa70 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
1aa80 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
1aa90 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1aaa0 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e  or;.  pPrior->pN
1aab0 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a  ext = p;..  /***
1aac0 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75   TBD:  Insert su
1aad0 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74  broutine calls t
1aae0 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  o close cursors 
1aaf0 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20  on incomplete.  
1ab00 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  **** subqueries 
1ab10 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43  ****/.  explainC
1ab20 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
1ab30 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
1ab40 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75  Sub2, 0);.  retu
1ab50 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21  rn pParse->nErr!
1ab60 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  =0;.}.#endif..#i
1ab70 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1ab80 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1ab90 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1aba0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1abb0 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
1abc0 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
1abd0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1abe0 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78  ist(sqlite3*, Ex
1abf0 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78  prList*, int, Ex
1ac00 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
1ac10 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1ac20 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65  t(sqlite3*, Sele
1ac30 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ct *, int, ExprL
1ac40 69 73 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ist*, int);../*.
1ac50 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1ac60 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1ac70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1ac80 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1ac90 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1aca0 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1acb0 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1acc0 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1acd0 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1ace0 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1acf0 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1ad00 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1ad10 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1ad20 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1ad30 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1ad40 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1ad50 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1ad60 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1ad70 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1ad80 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1ad90 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1ada0 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1adb0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1adc0 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1add0 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1ade0 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1adf0 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1ae00 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1ae10 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
1ae20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
1ae30 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
1ae40 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
1ae50 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
1ae60 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
1ae70 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
1ae80 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
1ae90 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1aea0 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
1aeb0 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
1aec0 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
1aed0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1aee0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1aef0 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
1af00 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
1af10 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
1af20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1af30 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1af40 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
1af50 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
1af60 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
1af70 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
1af80 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1af90 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1afa0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
1afb0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
1afc0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1afd0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1afe0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
1aff0 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
1b000 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1b010 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1b020 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1b030 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1b040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1b050 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
1b060 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
1b070 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
1b080 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
1b090 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b0a0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
1b0b0 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
1b0c0 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
1b0d0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1b0e0 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
1b0f0 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
1b100 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  n].pExpr, 0);.  
1b110 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1b120 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1b130 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
1b140 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pNew;.    }.  }e
1b150 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  lse{.    pExpr->
1b160 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1b170 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
1b180 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
1b190 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  st);.    pExpr->
1b1a0 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78  pRight = substEx
1b1b0 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
1b1c0 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
1b1d0 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
1b1e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1b1f0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1b200 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
1b210 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
1b220 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
1b230 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31  Table, pEList, 1
1b240 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b250 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1b260 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
1b270 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
1b280 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1b290 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1b2a0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1b2b0 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1b2c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1b2d0 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
1b2e0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
1b2f0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1b300 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
1b310 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
1b320 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1b330 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
1b340 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1b350 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1b360 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
1b370 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1b380 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
1b390 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
1b3a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1b3b0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1b3c0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
1b3d0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1b3e0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
1b3f0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
1b400 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b410 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1b420 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
1b430 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
1b440 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1b450 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
1b460 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
1b470 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1b480 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
1b490 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1b4a0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1b4b0 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1b4c0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1b4d0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
1b4e0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1b4f0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
1b500 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
1b510 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
1b520 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
1b530 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  lues */.  int do
1b540 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 2f  Prior          /
1b550 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1b560 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1b570 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1b580 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1b590 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1b5a0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1b5b0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1b5c0 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    sub
1b5d0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b5e0 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65  ->pEList, iTable
1b5f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
1b600 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b610 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
1b620 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b630 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1b640 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
1b650 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b660 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1b670 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1b680 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
1b690 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b6a0 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1b6b0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
1b6c0 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
1b6d0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 53 72  pEList);.    pSr
1b6e0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
1b6f0 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
1b700 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53   );.    for(i=pS
1b710 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d  rc->nSrc, pItem=
1b720 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSrc->a; i>0; i-
1b730 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
1b740 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
1b750 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
1b760 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b770 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
1b780 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
1b790 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
1b7a0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b7b0 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1b7c0 63 41 72 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  cArg, iTable, pE
1b7d0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
1b7e0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64     }.  }while( d
1b7f0 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70  oPrior && (p = p
1b800 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a  ->pPrior)!=0 );.
1b810 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1b820 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b830 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1b840 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b850 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1b860 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b870 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1b880 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1b890 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1b8a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b8b0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1b8c0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1b8d0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1b8e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1b8f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1b900 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1b910 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1b920 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1b930 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1b940 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1b950 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1b960 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1b970 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1b980 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1b990 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1b9a0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1b9b0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1b9c0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1b9d0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1b9e0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1b9f0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1ba00 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1ba10 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1ba20 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1ba30 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1ba40 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1ba50 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1ba60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1ba70 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1ba80 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1ba90 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1baa0 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1bab0 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1bac0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1bad0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1bae0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1baf0 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1bb00 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1bb10 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1bb20 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1bb30 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bb40 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1bb50 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1bb60 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1bb70 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1bb80 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1bb90 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1bba0 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1bbb0 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1bbc0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1bbd0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1bbe0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1bbf0 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1bc00 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1bc10 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1bc20 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1bc30 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1bc40 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1bc50 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1bc60 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1bc70 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1bc80 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1bc90 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1bca0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1bcb0 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
1bcc0 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
1bcd0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1bce0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1bcf0 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
1bd00 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1bd10 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1bd20 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
1bd30 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
1bd40 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1bd50 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1bd60 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f 75 74   or (2a) the out
1bd70 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1bd80 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  a join.**       
1bd90 20 61 6e 64 20 28 32 62 29 20 74 68 65 20 6f 75   and (2b) the ou
1bda0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1bdb0 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1bdc0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
1bdd0 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 46   one.**        F
1bde0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1bdf0 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63 61  ery that is a ca
1be00 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c 61 74  ndidate for flat
1be10 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69 73 0a  tening.  (2b is.
1be20 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20 74 6f  **        due to
1be30 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1be40 37 33 62 66 39 61 62 66 38 30 5d 20 66 72 6f 6d  73bf9abf80] from
1be50 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a   2015-02-09.).**
1be60 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
1be70 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
1be80 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1be90 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1bea0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
1beb0 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
1bec0 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
1bed0 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
1bee0 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
1bef0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1bf00 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
1bf10 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1bf20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1bf30 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1bf40 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1bf50 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1bf60 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1bf70 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1bf80 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1bf90 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1bfa0 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1bfb0 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1bfc0 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1bfd0 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1bfe0 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1bff0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1c000 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
1c010 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1c020 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
1c030 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c040 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
1c050 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1c060 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1c070 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
1c080 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1c090 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1c0a0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1c0b0 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1c0c0 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1c0d0 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74  a FROM close wit
1c0e0 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1c0f0 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1c100 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1c110 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1c120 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1c130 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1c140 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1c150 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
1c160 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c170 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1c180 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c190 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
1c1a0 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
1c1b0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1c1c0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1c1d0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1c1e0 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1c1f0 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
1c200 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72  .**  (**)  Restr
1c210 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20  iction (10) was 
1c220 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1c230 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32   code on 2005-02
1c240 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20  -05 but we.**   
1c250 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20       accidently 
1c260 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d  carried the comm
1c270 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69  ent forward unti
1c280 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f  l 2014-09-15.  O
1c290 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
1c2a0 20 20 74 65 78 74 3a 20 22 54 68 65 20 73 75 62    text: "The sub
1c2b0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c2c0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1c2d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c2e0 20 0a 2a 2a 20 20 20 20 20 20 20 20 64 6f 65 73   .**        does
1c2f0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 22   not use LIMIT."
1c300 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
1c310 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1c320 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1c330 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
1c340 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
1c350 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e  ..**.**  (**)  N
1c360 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20  ot implemented. 
1c370 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72   Subsumed into r
1c380 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20  estriction (3). 
1c390 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   Was previously.
1c3a0 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61  **        a sepa
1c3b0 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e  rate restriction
1c3c0 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74   deriving from t
1c3d0 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a  icket #350..**.*
1c3e0 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
1c3f0 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
1c400 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1c410 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a  h use LIMIT..**.
1c420 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75  **  (14)  The su
1c430 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c440 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  use OFFSET..**.*
1c450 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
1c460 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1c470 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1c480 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
1c490 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
1c4a0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
1c4b0 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
1c4c0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
1c4d0 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
1c4e0 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
1c4f0 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
1c500 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
1c510 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1c520 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
1c530 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
1c540 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
1c550 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
1c560 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
1c570 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
1c580 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
1c590 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
1c5a0 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
1c5b0 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
1c5c0 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20  .  .**.**  (17) 
1c5d0 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   The sub-query i
1c5e0 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  s not a compound
1c5f0 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69   select, or it i
1c600 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a  s a UNION ALL .*
1c610 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1c620 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70  d clause made up
1c630 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e   entirely of non
1c640 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
1c650 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  es, and .**     
1c660 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75     the parent qu
1c670 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ery:.**.**      
1c680 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73      * is not its
1c690 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f  elf part of a co
1c6a0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a  mpound select,.*
1c6b0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1c6c0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1c6d0 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65   or DISTINCT que
1c6e0 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ry, and.**      
1c6f0 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a      * is not a j
1c700 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  oin.**.**       
1c710 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
1c720 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
1c730 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
1c740 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
1c750 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
1c760 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
1c770 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
1c780 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
1c790 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
1c7a0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1c7b0 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75  clauses.  The su
1c7c0 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73  bquery cannot us
1c7d0 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  e any compound.*
1c7e0 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1c7f0 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  r other than UNI
1c800 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61  ON ALL because a
1c810 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d  ll the other com
1c820 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1c830 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61  operators have a
1c840 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e  n implied DISTIN
1c850 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61  CT which is disa
1c860 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20  llowed by.**    
1c870 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20      restriction 
1c880 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  (4)..**.**      
1c890 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d    Also, each com
1c8a0 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75  ponent of the su
1c8b0 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74  b-query must ret
1c8c0 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  urn the same num
1c8d0 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66  ber.**        of
1c8e0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
1c8f0 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c   This is actuall
1c900 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20  y a requirement 
1c910 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  for any compound
1c920 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43  .**        SELEC
1c930 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  T statement, but
1c940 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65   all the code he
1c950 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  re does is make 
1c960 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20  sure that no.** 
1c970 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c         such (ill
1c980 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20  egal) sub-query 
1c990 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68  is flattened. Th
1c9a0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65  e caller will de
1c9b0 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20  tect the.**     
1c9c0 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20     syntax error 
1c9d0 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74  and return a det
1c9e0 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a  ailed message..*
1c9f0 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74  *.**  (18)  If t
1ca00 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1ca10 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1ca20 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d  t, then all term
1ca30 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  s of the.**     
1ca40 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75     ORDER by clau
1ca50 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  se of the parent
1ca60 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20   must be simple 
1ca70 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a  references to .*
1ca80 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73  *        columns
1ca90 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1caa0 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20  y..**.**  (19)  
1cab0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1cac0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1cad0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1cae0 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
1caf0 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45        have a WHE
1cb00 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
1cb10 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73    (20)  If the s
1cb20 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1cb30 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1cb40 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20  hen it must not 
1cb50 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  use.**        an
1cb60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1cb70 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e  .  Ticket #3773.
1cb80 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78    We could relax
1cb90 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
1cba0 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77  .**        somew
1cbb0 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68  hat by saying th
1cbc0 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  at the terms of 
1cbd0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1cbe0 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20  use must.**     
1cbf0 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d     appear as unm
1cc00 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63  odified result c
1cc10 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75  olumns in the ou
1cc20 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ter query.  But 
1cc30 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  we.**        hav
1cc40 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
1cc50 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f  tions in mind to
1cc60 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20   deal with that 
1cc70 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31  case..**.**  (21
1cc80 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1cc90 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1cca0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1ccb0 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1ccc0 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1ccd0 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37    (See ticket [7
1cce0 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a  52e1646fc])..**.
1ccf0 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75  **  (22)  The su
1cd00 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  bquery is not a 
1cd10 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a  recursive CTE..*
1cd20 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20  *.**  (23)  The 
1cd30 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20  parent is not a 
1cd40 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f  recursive CTE, o
1cd50 72 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  r the sub-query 
1cd60 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20  is not a.**     
1cd70 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72     compound quer
1cd80 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74  y. This restrict
1cd90 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74  ion is because t
1cda0 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a  ransforming the.
1cdb0 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74  **        parent
1cdc0 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   to a compound q
1cdd0 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68  uery confuses th
1cde0 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64  e code that hand
1cdf0 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  les.**        re
1ce00 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20  cursive queries 
1ce10 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29  in multiSelect()
1ce20 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54  ..**.**  (24)  T
1ce30 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1ce40 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1ce50 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
1ce60 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
1ce70 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
1ce80 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
1ce90 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
1cea0 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
1ceb0 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
1cec0 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
1ced0 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
1cee0 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
1cef0 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
1cf00 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
1cf10 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
1cf20 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
1cf30 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
1cf40 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
1cf50 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
1cf60 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
1cf70 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
1cf80 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1cf90 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
1cfa0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
1cfb0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1cfc0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
1cfd0 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
1cfe0 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
1cff0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1d000 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1d010 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
1d020 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1d030 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
1d040 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
1d050 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
1d060 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
1d070 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
1d080 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
1d090 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
1d0a0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
1d0b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
1d0c0 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
1d0d0 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
1d0e0 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
1d0f0 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
1d100 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1d110 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
1d120 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
1d130 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
1d140 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
1d150 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1d160 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1d170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d180 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
1d190 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d1a0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
1d1b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
1d1c0 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
1d1d0 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
1d1e0 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
1d1f0 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
1d200 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1d210 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
1d220 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1d230 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
1d240 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
1d250 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
1d260 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1d270 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1d280 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1d290 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
1d2a0 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
1d2b0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
1d2c0 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
1d2d0 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20  ;    /* Current 
1d2e0 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f  UNION ALL term o
1d2f0 66 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72  f the other quer
1d300 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  y */.  Select *p
1d310 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
1d320 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
1d330 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
1d340 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
1d350 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d360 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
1d370 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
1d380 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1d390 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
1d3a0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1d3b0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1d3c0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1d3d0 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
1d3e0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1d3f0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1d400 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1d410 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
1d420 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1d430 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1d440 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
1d450 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
1d460 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1d470 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
1d480 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
1d490 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1d4a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1d4b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
1d4c0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1d4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d4e0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1d4f0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1d500 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
1d510 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
1d520 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
1d530 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1d540 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
1d550 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
1d560 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1d570 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
1d580 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
1d590 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1d5a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
1d5b0 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61  or==0 );  /* Una
1d5c0 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63  ble to flatten c
1d5d0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20  ompound queries 
1d5e0 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1d5f0 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
1d600 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  , SQLITE_QueryFl
1d610 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72  attener) ) retur
1d620 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
1d630 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1d640 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
1d650 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
1d660 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
1d670 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
1d680 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74  From];.  iParent
1d690 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
1d6a0 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70  rsor;.  pSub = p
1d6b0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1d6c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1d6d0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62  !=0 );.  if( sub
1d6e0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1d6f0 20 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65    if( isAgg ) re
1d700 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d720 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d730 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20  ction (1)   */. 
1d740 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72     if( pSrc->nSr
1d750 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d770 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d780 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a  iction (2a)  */.
1d790 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65      if( (p->pWhe
1d7a0 72 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  re && ExprHasPro
1d7b0 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c  perty(p->pWhere,
1d7c0 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20  EP_Subquery)).  
1d7d0 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78     || (sqlite3Ex
1d7e0 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70  prListFlags(p->p
1d7f0 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71  EList) & EP_Subq
1d800 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c  uery)!=0.     ||
1d810 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   (sqlite3ExprLis
1d820 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72  tFlags(p->pOrder
1d830 42 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72  By) & EP_Subquer
1d840 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  y)!=0.    ){.   
1d850 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d880 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d890 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20  tion (2b)  */.  
1d8a0 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70    }.  }.    .  p
1d8b0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1d8c0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1d8d0 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
1d8e0 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
1d8f0 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
1d900 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
1d910 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
1d920 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
1d930 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
1d940 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  essions, we allo
1d950 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
1d960 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
1d970 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1d980 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
1d990 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
1d9a0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
1d9b0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1d9c0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1d9d0 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
1d9e0 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
1d9f0 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
1da00 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
1da10 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
1da20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1da30 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
1da40 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da60 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
1da70 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1da80 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
1da90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dab0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
1dac0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
1dad0 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70  lFlags & SF_Comp
1dae0 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62  ound)!=0 && pSub
1daf0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1db00 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1db40 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
1db50 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
1db60 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
1db70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1db80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1db90 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
1dba0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1dbb0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1dbc0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
1dbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dbe0 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
1dbf0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1dc00 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
1dc10 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
1dc20 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1dc30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dc40 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
1dc50 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1dc60 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1dc70 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
1dc80 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1dc90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1dca0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1dcb0 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
1dcc0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
1dcd0 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
1dce0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
1dcf0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1dd30 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
1dd40 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
1dd50 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
1dd60 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1dd70 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dd80 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
1dd90 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1dda0 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
1ddb0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1ddc0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ddd0 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
1dde0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1ddf0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
1de00 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1de10 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1de20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1de30 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
1de40 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  /.  }.  testcase
1de50 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1de60 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
1de70 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
1de80 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1de90 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a  SF_MinMaxAgg );.
1dea0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1deb0 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
1dec0 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67  sive|SF_MinMaxAg
1ded0 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
1dee0 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69   0; /* Restricti
1def0 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34  ons (22) and (24
1df00 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
1df10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1df20 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
1df30 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1df40 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
1df50 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29  Restriction (23)
1df60 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42   */.  }..  /* OB
1df70 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
1df80 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
1df90 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
1dfa0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1dfb0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1dfc0 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
1dfd0 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
1dfe0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1dff0 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
1e000 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
1e010 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
1e020 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1e030 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1e040 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1e050 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
1e060 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1e070 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1e080 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1e090 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1e0a0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1e0b0 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
1e0c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
1e0d0 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
1e0e0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
1e0f0 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
1e100 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
1e110 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
1e120 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1e130 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1e140 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1e150 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
1e160 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1e170 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
1e180 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1e190 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
1e1a0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1e1b0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1e1c0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1e1d0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1e1e0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1e1f0 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
1e200 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1e210 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1e220 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1e230 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1e240 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1e250 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
1e260 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
1e270 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
1e280 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
1e290 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
1e2a0 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
1e2b0 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
1e2c0 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
1e2d0 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
1e2e0 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
1e2f0 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
1e300 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
1e310 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
1e320 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
1e330 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
1e340 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
1e350 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1e360 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
1e370 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
1e380 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
1e390 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
1e3a0 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
1e3b0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1e3c0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
1e3d0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
1e3e0 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
1e3f0 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
1e400 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66  if( (pSubitem->f
1e410 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
1e420 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
1e430 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1e440 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e450 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d   17: If the sub-
1e460 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1e470 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
1e480 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
1e490 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
1e4a0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
1e4b0 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
1e4c0 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
1e4d0 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
1e4e0 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
1e4f0 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
1e500 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
1e510 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
1e520 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
1e530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
1e540 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1e550 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
1e560 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  By ){.      retu
1e570 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69  rn 0;  /* Restri
1e580 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20  ction 20 */.    
1e590 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
1e5a0 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
1e5b0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1e5c0 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
1e5d0 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
1e5e0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1e5f0 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
1e600 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
1e610 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
1e620 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
1e630 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1e640 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1e650 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1e660 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
1e670 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1e680 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1e690 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1e6a0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
1e6b0 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
1e6c0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
1e6d0 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
1e6e0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1e6f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53  EList->nExpr==pS
1e700 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
1e710 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pr );.      if( 
1e720 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1e730 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1e740 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
1e750 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  0.       || (pSu
1e760 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
1e770 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
1e780 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62   .       || pSub
1e790 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a  1->pSrc->nSrc<1.
1e7a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1e7b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1e7c0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
1e7d0 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  e( pSub1->pSrc->
1e7e0 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a  nSrc>1 );.    }.
1e7f0 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  .    /* Restrict
1e800 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69  ion 18. */.    i
1e810 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
1e820 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
1e830 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1e840 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  ii<p->pOrderBy->
1e850 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
1e860 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
1e870 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78  derBy->a[ii].u.x
1e880 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20  .iOrderByCol==0 
1e890 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1e8a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1e8b0 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65   /***** If we re
1e8c0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
1e8d0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1e8e0 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a  rmitted. *****/.
1e8f0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
1e900 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74  pParse,p,("flatt
1e910 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65  en %s.%p from te
1e920 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  rm %d\n",.      
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75               pSu
1e940 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75  b->zSelName, pSu
1e950 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f  b, iFrom));..  /
1e960 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
1e970 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
1e980 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1e990 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
1e9a0 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Name;.  TESTONLY
1e9b0 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74  (i =) sqlite3Aut
1e9c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1e9d0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1e9e0 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61   0, 0);.  testca
1e9f0 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45  se( i==SQLITE_DE
1ea00 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  NY );.  pParse->
1ea10 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
1ea20 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1ea30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
1ea40 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1ea50 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1ea60 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
1ea70 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
1ea80 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
1ea90 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
1eaa0 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
1eab0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1eac0 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
1ead0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
1eae0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1eaf0 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
1eb00 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
1eb10 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
1eb20 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
1eb30 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
1eb40 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
1eb50 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1eb60 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
1eb70 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
1eb80 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
1eb90 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
1eba0 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1ebb0 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
1ebc0 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
1ebd0 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
1ebe0 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
1ebf0 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1ec00 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
1ec10 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
1ec20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
1ec30 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1ec40 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
1ec50 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
1ec60 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
1ec70 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
1ec80 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
1ec90 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1eca0 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
1ecb0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1ecc0 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
1ecd0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1ece0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1ecf0 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
1ed00 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
1ed10 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
1ed20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
1ed30 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
1ed40 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
1ed50 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1ed60 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
1ed70 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
1ed80 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
1ed90 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1eda0 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
1edb0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1edc0 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
1edd0 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
1ede0 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1edf0 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1ee00 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
1ee10 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
1ee20 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
1ee30 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
1ee40 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
1ee50 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
1ee60 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1ee70 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
1ee80 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
1ee90 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
1eea0 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
1eeb0 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
1eec0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
1eed0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
1eee0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1eef0 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
1ef00 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
1ef10 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d   Expr *pOffset =
1ef20 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
1ef30 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
1ef40 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
1ef50 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
1ef60 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1ef70 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
1ef80 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
1ef90 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  mit = 0;.    p->
1efa0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
1efb0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
1efc0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
1efd0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  0);.    sqlite3S
1efe0 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65  electSetName(pNe
1eff0 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d  w, pSub->zSelNam
1f000 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73  e);.    p->pOffs
1f010 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
1f020 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
1f030 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
1f040 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1f050 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1f060 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
1f070 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  = TK_ALL;.    if
1f080 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1f090 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
1f0a0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
1f0b0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
1f0c0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1f0d0 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
1f0e0 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
1f0f0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  = pNew;.      pN
1f100 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ew->pNext = p;. 
1f110 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
1f120 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c   pNew;.      SEL
1f130 45 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73  ECTTRACE(2,pPars
1f140 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22  e,p,.         ("
1f150 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1f160 79 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61  y flattener crea
1f170 74 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65  tes %s.%p as pee
1f180 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  r\n",.         p
1f190 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  New->zSelName, p
1f1a0 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  New));.    }.   
1f1b0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1f1c0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1f1d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
1f1e0 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
1f1f0 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
1f200 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1f210 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
1f220 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
1f230 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
1f240 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
1f250 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
1f260 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
1f270 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
1f280 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1f290 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1f2a0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
1f2b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1f2c0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
1f2d0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f2e0 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1f2f0 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
1f300 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1f310 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
1f320 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1f330 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
1f340 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
1f350 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
1f360 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
1f370 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
1f380 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
1f390 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
1f3a0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1f3b0 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
1f3c0 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
1f3d0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
1f3e0 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
1f3f0 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
1f400 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
1f410 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
1f420 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
1f430 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
1f440 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
1f450 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
1f460 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
1f470 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
1f480 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
1f490 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
1f4a0 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
1f4b0 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
1f4c0 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
1f4d0 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
1f4e0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
1f4f0 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
1f500 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
1f510 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d  TabToDel->nRef==
1f520 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
1f530 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1f540 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1f550 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
1f560 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
1f570 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
1f580 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1f590 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
1f5a0 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
1f5b0 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
1f5c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
1f5d0 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  ToDel->nRef--;. 
1f5e0 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65     }.    pSubite
1f5f0 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d  m->pTab = 0;.  }
1f600 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1f610 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
1f620 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72  nce for each ter
1f630 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  m in a compound-
1f640 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c  subquery.  ** fl
1f650 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73  attening (as des
1f660 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20  cribed above).  
1f670 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1f680 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64  a different kind
1f690 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e  .  ** of flatten
1f6a0 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69  ing - a flatteni
1f6b0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
1f6c0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1f6d0 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20  y flattening -. 
1f6e0 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f   ** then this lo
1f6f0 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63  op only runs onc
1f700 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
1f710 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c  s loop moves all
1f720 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
1f730 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
1f740 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1f750 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
1f760 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1f770 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
1f780 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
1f790 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
1f7a0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1f7b0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
1f7c0 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
1f7d0 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
1f7e0 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
1f7f0 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
1f800 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
1f810 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
1f820 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
1f830 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
1f840 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
1f850 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
1f860 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
1f870 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
1f880 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1f890 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
1f8a0 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
1f8b0 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
1f8c0 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
1f8d0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  in..  */.  for(p
1f8e0 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
1f8f0 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
1f900 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
1f910 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1f920 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b      int nSubSrc;
1f930 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65  .    u8 jointype
1f940 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
1f950 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
1f960 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1f970 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
1f980 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
1f990 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
1f9a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1f9b0 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
1f9c0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1f9d0 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
1f9e0 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1f9f0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1fa00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1fa10 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
1fa20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1fa30 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
1fa40 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
1fa50 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1fa60 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1fa70 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a  = pSubitem->fg.j
1fa80 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
1fa90 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1faa0 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
1fab0 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
1fac0 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
1fad0 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1fae0 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
1faf0 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
1fb00 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1fb10 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
1fb20 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
1fb30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1fb40 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1fb50 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1fb60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1fb70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1fb80 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1fb90 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
1fba0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1fbb0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
1fbc0 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
1fbd0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
1fbe0 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
1fbf0 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
1fc00 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
1fc10 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
1fc20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
1fc30 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1fc40 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
1fc50 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
1fc60 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1fc70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1fc80 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1fc90 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
1fca0 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
1fcb0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
1fcc0 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
1fcd0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1fce0 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
1fcf0 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
1fd00 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
1fd10 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
1fd20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1fd30 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
1fd40 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
1fd50 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
1fd60 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
1fd70 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
1fd80 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
1fd90 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75   query FROM clau
1fda0 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20  se to 4 slots.. 
1fdb0 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65     ** The middle
1fdc0 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
1fdd0 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
1fde0 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
1fdf0 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72  space.    ** for
1fe00 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74   the two element
1fe10 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1fe20 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1fe30 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1fe40 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
1fe50 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
1fe60 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
1fe70 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1fe80 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
1fe90 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
1fea0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
1feb0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1fec0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1fed0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1fee0 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
1fef0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1ff00 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
1ff10 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1ff20 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1ff30 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
1ff40 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
1ff50 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
1ff60 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1ff70 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
1ff80 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
1ff90 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
1ffa0 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
1ffb0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
1ffc0 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
1ffd0 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
1ffe0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
1fff0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
20000 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69  >a[iFrom].fg.joi
20010 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
20020 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
20030 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
20040 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
20050 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
20060 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
20070 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
20080 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
20090 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
200a0 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
200b0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
200c0 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
200d0 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
200e0 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
200f0 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
20100 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
20110 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
20120 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
20130 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
20140 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
20150 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
20160 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
20170 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
20180 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
20190 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
201a0 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
201b0 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
201c0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
201d0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
201e0 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
201f0 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
20200 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
20210 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
20220 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
20230 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
20240 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
20250 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
20260 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
20270 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
20280 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
20290 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
202a0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
202b0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
202c0 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
202d0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69  DbStrDup(db, pLi
202e0 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
202f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20300 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
20310 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
20320 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
20330 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
20340 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
20350 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
20360 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
20370 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20  t, any non-zero 
20380 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75  iOrderByCol valu
20390 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  es indicate that
203a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52   the.      ** OR
203b0 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78  DER BY column ex
203c0 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e  pression is iden
203d0 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72  tical to the iOr
203e0 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20  derByCol'th.    
203f0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
20400 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
20410 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75  CT statement pSu
20420 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76  b. Since these v
20430 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64  alues.      ** d
20440 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  o not necessaril
20450 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  y correspond to 
20460 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43  columns in SELEC
20470 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72  T statement pPar
20480 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65  ent,.      ** ze
20490 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74  ro them before t
204a0 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f  ransfering the O
204b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
204c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
204d0 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73  * Not doing this
204e0 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72   may cause an er
204f0 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75  ror if a subsequ
20500 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ent call to this
20510 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
20520 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  on attempts to f
20530 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e  latten a compoun
20540 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f  d sub-query into
20550 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a   pParent.      *
20560 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  * (the only way 
20570 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
20580 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75  is if the compou
20590 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a  nd sub-query is.
205a0 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
205b0 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d  ly part of pSub-
205c0 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b  >pSrc). See tick
205d0 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e  et [d11a6e908f].
205e0 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
205f0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
20600 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
20610 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
20620 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
20630 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
20640 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
20650 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
20660 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
20670 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
20680 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
20690 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
206a0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  pSub->pPrior==0 
206b0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
206c0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
206d0 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
206e0 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
206f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72  .    }.    pWher
20700 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
20710 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
20720 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ere, 0);.    if(
20730 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
20740 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20750 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20760 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
20770 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
20780 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
20790 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
207a0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
207b0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
207c0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
207d0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
207e0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
207f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
20820 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
20830 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
20840 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
20850 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
20860 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
20870 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
20880 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
20890 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
208a0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
208b0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
208c0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
208d0 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
208e0 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
208f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75  e);.    }.    su
20900 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 50  bstSelect(db, pP
20910 61 72 65 6e 74 2c 20 69 50 61 72 65 6e 74 2c 20  arent, iParent, 
20920 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 30 29  pSub->pEList, 0)
20930 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
20940 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
20950 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
20960 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
20970 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
20980 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
20990 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
209a0 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
209b0 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
209c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
209d0 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
209e0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
209f0 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
20a00 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
20a10 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
20a20 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
20a30 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
20a40 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
20a50 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
20a60 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
20a70 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
20a80 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
20a90 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
20aa0 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
20ab0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
20ac0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
20ad0 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
20ae0 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
20af0 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
20b00 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
20b10 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
20b20 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
20b30 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
20b40 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
20b50 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
20b60 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
20b70 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
20b80 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c  pSub1);..#if SEL
20b90 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
20ba0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
20bb0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
20bc0 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
20bd0 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
20be0 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74  e,p,("After flat
20bf0 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20  tening:\n"));.  
20c00 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
20c10 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
20c20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
20c30 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
20c40 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
20c50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
20c60 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
20c70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
20c80 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  W) */....#if !de
20c90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
20ca0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
20cb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20cc0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
20cd0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72  Make copies of r
20ce0 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c  elevant WHERE cl
20cf0 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68  ause terms of th
20d00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e  e outer query in
20d10 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  to.** the WHERE 
20d20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
20d30 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ry.  Example:.**
20d40 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
20d50 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
20d60 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
20d70 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35  OM t1) WHERE x=5
20d80 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
20d90 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
20da0 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  o:.**.**    SELE
20db0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
20dc0 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
20dd0 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   y FROM t1 WHERE
20de0 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29   a=5 AND c-d=10)
20df0 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d  .**     WHERE x=
20e00 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
20e10 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68  * The hope is th
20e20 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64  at the terms add
20e30 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20  ed to the inner 
20e40 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20  query will make 
20e50 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63  it more.** effic
20e60 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  ient..**.** Do n
20e70 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20  ot attempt this 
20e80 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a  optimization if:
20e90 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65  .**.**   (1) The
20ea0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
20eb0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 28  an aggregate.  (
20ec0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 77 65  In that case, we
20ed0 27 64 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a  'd really want.*
20ee0 2a 20 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20  *       to copy 
20ef0 74 68 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d  the outer WHERE-
20f00 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74  clause terms ont
20f10 6f 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  o the HAVING cla
20f20 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  use of the.**   
20f30 20 20 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e      inner query.
20f40 20 20 42 75 74 20 74 68 65 79 20 70 72 6f 62 61    But they proba
20f50 62 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74  bly won't help t
20f60 68 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62  here so do not b
20f70 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  other.).**.**   
20f80 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (2) The inner qu
20f90 65 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72  ery is the recur
20fa0 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63  sive part of a c
20fb0 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72  ommon table expr
20fc0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
20fd0 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (3) The inner qu
20fe0 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20  ery has a LIMIT 
20ff0 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68  clause (since th
21000 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
21010 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20   WHERE.**       
21020 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e  close would chan
21030 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f  ge the meaning o
21040 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a  f the LIMIT)..**
21050 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e  .**   (4) The in
21060 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
21070 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
21080 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
21090 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20  (The caller.**  
210a0 20 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68       enforces th
210b0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73  is restriction s
210c0 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
210d0 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  e does not have 
210e0 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20  enough.**       
210f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b  information to k
21100 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35  now.).**.**   (5
21110 29 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  ) The WHERE clau
21120 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  se expression or
21130 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20  iginates in the 
21140 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
21150 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61  se.**       of a
21160 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a   LEFT JOIN..**.*
21170 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f  * Return 0 if no
21180 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
21190 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  e and non-zero i
211a0 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  f one or more WH
211b0 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65  ERE clause.** te
211c0 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74  rms are duplicat
211d0 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71  ed into the subq
211e0 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
211f0 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72  int pushDownWher
21200 65 54 65 72 6d 73 28 0a 20 20 73 71 6c 69 74 65  eTerms(.  sqlite
21210 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
21220 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
21230 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20  connection (for 
21240 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20 20 53  malloc()) */.  S
21250 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20  elect *pSubq,   
21260 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
21270 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45  uery whose WHERE
21280 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65   clause is to be
21290 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   augmented */.  
212a0 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
212b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
212c0 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
212d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
212e0 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20    int iCursor   
212f0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
21300 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
21310 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
21320 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
21330 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20  nt nChng = 0;.  
21340 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20  if( pWhere==0 ) 
21350 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
21360 28 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73  (pSubq->selFlags
21370 20 26 20 28 53 46 5f 41 67 67 72 65 67 61 74 65   & (SF_Aggregate
21380 7c 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 21  |SF_Recursive))!
21390 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
213a0 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
213b0 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28 32 29  ions (1) and (2)
213c0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
213d0 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  ubq->pLimit!=0 )
213e0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
213f0 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
21400 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69  (3) */.  }.  whi
21410 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d  le( pWhere->op==
21420 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43  TK_AND ){.    nC
21430 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57  hng += pushDownW
21440 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53  hereTerms(db, pS
21450 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69  ubq, pWhere->pRi
21460 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20  ght, iCursor);. 
21470 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65     pWhere = pWhe
21480 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20  re->pLeft;.  }. 
21490 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
214a0 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46  erty(pWhere,EP_F
214b0 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
214c0 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
214d0 69 6f 6e 20 35 20 2a 2f 0a 20 20 69 66 28 20 73  ion 5 */.  if( s
214e0 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
214f0 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65  eConstant(pWhere
21500 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  , iCursor) ){.  
21510 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77    nChng++;.    w
21520 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20  hile( pSubq ){. 
21530 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
21540 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
21550 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20  Where, 0);.     
21560 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70   pNew = substExp
21570 72 28 64 62 2c 20 70 4e 65 77 2c 20 69 43 75 72  r(db, pNew, iCur
21580 73 6f 72 2c 20 70 53 75 62 71 2d 3e 70 45 4c 69  sor, pSubq->pELi
21590 73 74 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71  st);.      pSubq
215a0 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
215b0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 53  e3ExprAnd(db, pS
215c0 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65  ubq->pWhere, pNe
215d0 77 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71 20  w);.      pSubq 
215e0 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b  = pSubq->pPrior;
215f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21600 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e  urn nChng;.}.#en
21610 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
21620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21630 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
21640 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
21650 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61  EW) */../*.** Ba
21660 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
21670 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e  nts of the AggIn
21680 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  fo structure ind
21690 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
216a0 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
216b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
216c0 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c  hecks if the fol
216d0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
216e0 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
216f0 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a  query contains j
21700 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ust a single agg
21710 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
21720 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67  .**    * the agg
21730 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
21740 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20  is either min() 
21750 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a  or max(), and.**
21760 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65      * the argume
21770 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  nt to the aggreg
21780 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
21790 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a  a column value..
217a0 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  **.** If all of 
217b0 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72  the above are tr
217c0 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f  ue, then WHERE_O
217d0 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
217e0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a  ERE_ORDERBY_MAX.
217f0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
21800 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41  s appropriate. A
21810 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  lso, *ppMinMax i
21820 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
21830 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f  o the .** list o
21840 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
21850 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ed to the aggreg
21860 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ate before retur
21870 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ning..**.** Or, 
21880 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  if the condition
21890 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20  s above are not 
218a0 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  met, *ppMinMax i
218b0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
218c0 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
218d0 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e  NORMAL is return
218e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ed..*/.static u8
218f0 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67   minMaxQuery(Agg
21900 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20  Info *pAggInfo, 
21910 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
21920 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
21930 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
21940 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20  _NORMAL;        
21950 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
21960 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61  e */..  *ppMinMa
21970 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67  x = 0;.  if( pAg
21980 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20  gInfo->nFunc==1 
21990 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
219a0 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  pr = pAggInfo->a
219b0 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f  Func[0].pExpr; /
219c0 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63  * Aggregate func
219d0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
219e0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
219f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
21a00 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
21a10 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
21a20 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
21a30 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
21a40 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
21a50 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
21a60 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
21a70 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
21a80 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
21a90 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
21aa0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
21ab0 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75  zFunc = pExpr->u
21ac0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69  .zToken;.      i
21ad0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
21ae0 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
21af0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
21b00 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
21b10 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
21b20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
21b30 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  st;.      }else 
21b40 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
21b50 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
21b60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
21b70 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
21b80 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20  RBY_MAX;.       
21b90 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
21ba0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
21bb0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
21bc0 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  ( *ppMinMax==0 |
21bd0 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e  | (*ppMinMax)->n
21be0 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Expr==1 );.  ret
21bf0 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
21c00 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
21c10 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
21c20 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
21c30 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
21c40 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
21c50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
21c60 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
21c70 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
21c80 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
21c90 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
21ca0 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
21cb0 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
21cc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
21cd0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
21ce0 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
21cf0 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
21d00 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
21d10 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
21d20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
21d30 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
21d40 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
21d50 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
21d60 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
21d70 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
21d80 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
21d90 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
21da0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
21db0 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
21dc0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
21dd0 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
21de0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
21df0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
21e00 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
21e10 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
21e20 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
21e30 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
21e40 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
21e50 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
21e60 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
21e70 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
21e80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
21e90 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
21ea0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
21eb0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
21ec0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
21ed0 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
21ee0 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
21ef0 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
21f00 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
21f10 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
21f20 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
21f30 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
21f40 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
21f50 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
21f60 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
21f70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
21f80 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
21f90 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
21fa0 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
21fb0 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
21fc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
21fd0 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
21fe0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
21ff0 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
22000 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
22010 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
22020 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
22030 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
22040 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
22050 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
22060 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
22070 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
22080 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
22090 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
220a0 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
220b0 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
220c0 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
220d0 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
220e0 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
220f0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
22100 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
22110 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
22120 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
22130 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
22140 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
22150 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
22160 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
22170 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
22180 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
22190 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
221a0 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73   && pFrom->fg.is
221b0 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20  IndexedBy ){.   
221c0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
221d0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
221e0 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79  char *zIndexedBy
221f0 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e   = pFrom->u1.zIn
22200 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
22210 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
22220 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
22230 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
22240 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
22250 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
22260 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
22270 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
22280 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
22290 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
222a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
222b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
222c0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
222d0 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
222e0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
222f0 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
22300 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
22310 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
22320 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
22330 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  IBIndex = pIdx;.
22340 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
22350 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
22360 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
22370 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
22380 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
22390 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
223a0 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
223b0 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
223c0 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
223d0 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
223e0 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
223f0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
22400 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
22410 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
22420 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
22430 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
22440 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
22450 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
22460 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
22470 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
22480 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
22490 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
224a0 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
224b0 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
224c0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
224d0 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
224e0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
224f0 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
22500 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
22510 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
22520 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
22530 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
22540 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
22550 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
22560 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
22570 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
22580 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
22590 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
225a0 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
225b0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
225c0 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
225d0 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
225e0 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
225f0 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
22600 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
22610 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
22620 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
22630 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
22640 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
22650 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
22660 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
22670 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
22680 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
22690 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
226a0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
226b0 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
226c0 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
226d0 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
226e0 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
226f0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
22700 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
22710 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
22720 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
22730 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
22740 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
22750 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
22760 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
22770 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
22780 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
22790 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
227a0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
227b0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
227c0 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
227d0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
227e0 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
227f0 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
22800 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
22810 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
22820 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
22830 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
22840 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
22850 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
22860 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
22870 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
22880 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
22890 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
228a0 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
228b0 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
228c0 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
228d0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
228e0 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
228f0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
22900 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
22910 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
22920 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
22930 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
22940 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
22950 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
22960 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
22970 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
22980 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
22990 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
229a0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
229b0 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
229c0 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
229d0 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
229e0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
229f0 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
22a00 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
22a10 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
22a20 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
22a30 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
22a40 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
22a50 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
22a60 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
22a70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
22a80 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
22a90 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
22aa0 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a  b, TK_ALL, 0));.
22ab0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c    p->op = TK_SEL
22ac0 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  ECT;.  p->pWhere
22ad0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47   = 0;.  pNew->pG
22ae0 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e  roupBy = 0;.  pN
22af0 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b  ew->pHaving = 0;
22b00 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
22b10 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69  y = 0;.  p->pPri
22b20 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65  or = 0;.  p->pNe
22b30 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69  xt = 0;.  p->pWi
22b40 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c  th = 0;.  p->sel
22b50 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
22b60 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28  pound;.  assert(
22b70 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
22b80 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30  SF_Converted)==0
22b90 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
22ba0 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65  s |= SF_Converte
22bb0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
22bc0 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
22bd0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
22be0 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
22bf0 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
22c00 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
22c10 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
22c20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
22c30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22c40 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
22c50 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
22c60 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
22c70 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
22c80 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
22c90 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
22ca0 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
22cb0 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
22cc0 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
22cd0 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
22ce0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
22cf0 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
22d00 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
22d10 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
22d20 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
22d30 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22d40 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
22d50 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
22d60 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
22d70 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
22d80 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
22d90 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
22da0 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
22db0 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
22dc0 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
22dd0 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
22de0 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
22df0 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
22e00 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
22e10 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
22e20 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
22e30 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
22e40 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54  nt innermost WIT
22e50 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
22e60 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
22e70 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
22e80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
22e90 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
22ea0 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
22eb0 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
22ec0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
22ed0 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
22ee0 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
22ef0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
22f00 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
22f10 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
22f20 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
22f30 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
22f40 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
22f50 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
22f60 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
22f70 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
22f80 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
22f90 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
22fa0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
22fb0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
22fc0 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
22fd0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
22fe0 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
22ff0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
23000 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
23010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23020 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23030 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
23040 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
23050 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
23060 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
23070 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
23080 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
23090 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
230a0 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
230b0 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
230c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
230d0 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
230e0 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
230f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23100 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
23110 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
23120 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
23130 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
23140 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
23150 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
23160 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
23170 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
23180 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
23190 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
231a0 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
231b0 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
231c0 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
231d0 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
231e0 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
231f0 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
23200 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
23210 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
23220 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
23230 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
23240 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
23250 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
23260 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
23270 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
23280 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28  t( bFree==0 || (
23290 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
232a0 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74   && pParse->pWit
232b0 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20  hToFree==0) );. 
232c0 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
232d0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
232e0 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29  ->pWith!=pWith )
232f0 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  ;.    pWith->pOu
23300 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
23310 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
23320 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
23330 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
23340 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
23350 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  ree = pWith;.  }
23360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23370 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
23380 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
23390 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
233a0 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
233b0 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
233c0 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
233d0 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
233e0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
233f0 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
23400 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
23410 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
23420 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
23430 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
23440 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
23450 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
23460 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
23470 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
23480 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
23490 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
234a0 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
234b0 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
234c0 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
234d0 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
234e0 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
234f0 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
23500 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
23510 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
23520 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
23530 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
23540 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
23550 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
23560 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
23570 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
23580 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
23590 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
235a0 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
235b0 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
235c0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
235d0 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
235e0 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
235f0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
23600 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
23610 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
23620 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
23630 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
23640 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
23650 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
23660 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
23670 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
23680 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23690 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
236a0 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
236b0 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
236c0 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
236d0 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
236e0 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23700 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
23710 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
23720 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
23730 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
23740 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
23750 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
23760 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
23770 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
23780 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
23790 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
237a0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
237b0 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
237c0 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
237e0 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
237f0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
23800 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
23810 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
23820 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
23830 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
23840 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
23850 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
23860 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
23870 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
23880 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
23890 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
238a0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
238b0 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
238c0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
238d0 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
238e0 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
238f0 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
23900 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
23910 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
23920 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
23930 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
23940 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
23950 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
23960 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
23970 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20  ve reference..  
23980 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
23990 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  e, proceed.  */.
239a0 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43      if( pCte->zC
239b0 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  teErr ){.      s
239c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
239d0 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74  Parse, pCte->zCt
239e0 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  eErr, pCte->zNam
239f0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
23a00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
23a10 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
23a20 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
23a30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70   );.    pFrom->p
23a40 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
23a50 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
23a60 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
23a70 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  e));.    if( pTa
23a80 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
23a90 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61  C_Abort;.    pTa
23aa0 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
23ab0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
23ac0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
23ad0 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
23ae0 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
23af0 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d   = -1;.    pTab-
23b00 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
23b10 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
23b20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
23b30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54  48576) );.    pT
23b40 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
23b50 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54  TF_Ephemeral | T
23b60 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
23b70 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65  ;.    pFrom->pSe
23b80 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
23b90 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65  lectDup(db, pCte
23ba0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
23bb0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
23bc0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
23bd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23be0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
23bf0 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20  ->pSelect );..  
23c00 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
23c10 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69 76  is is a recursiv
23c20 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53  e CTE. */.    pS
23c30 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
23c40 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63  ect;.    bMayRec
23c50 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d  ursive = ( pSel-
23c60 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
23c70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  Sel->op==TK_UNIO
23c80 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  N );.    if( bMa
23c90 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
23ca0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
23cb0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
23cc0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d   pFrom->pSelect-
23cd0 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72  >pSrc;.      for
23ce0 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
23cf0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
23d00 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
23d10 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
23d20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
23d30 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
23d40 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20  Database==0 .   
23d50 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e        && pItem->
23d60 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20  zName!=0 .      
23d70 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
23d80 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a  StrICmp(pItem->z
23d90 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  Name, pCte->zNam
23da0 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  e).          ){.
23db0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
23dc0 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
23dd0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66          pItem->f
23de0 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20  g.isRecursive = 
23df0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
23e00 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  b->nRef++;.     
23e10 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
23e20 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73  ags |= SF_Recurs
23e30 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ive;.        }. 
23e40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
23e50 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65    /* Only one re
23e60 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
23e70 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
23e80 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62  */ .    if( pTab
23e90 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20  ->nRef>2 ){.    
23ea0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23eb0 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  g(.          pPa
23ec0 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72  rse, "multiple r
23ed0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63  eferences to rec
23ee0 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73  ursive table: %s
23ef0 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20  ", pCte->zName. 
23f00 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
23f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
23f20 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  R;.    }.    ass
23f30 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d  ert( pTab->nRef=
23f40 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65  =1 || ((pSel->se
23f50 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73  lFlags&SF_Recurs
23f60 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52  ive) && pTab->nR
23f70 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
23f80 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
23f90 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e  circular referen
23fa0 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61  ce: %s";.    pSa
23fb0 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65  vedWith = pParse
23fc0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
23fd0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
23fe0 74 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  th;.    sqlite3W
23ff0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
24000 72 2c 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  r, bMayRecursive
24010 20 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20   ? pSel->pPrior 
24020 3a 20 70 53 65 6c 29 3b 0a 20 20 20 20 70 50 61  : pSel);.    pPa
24030 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
24040 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65  th;..    for(pLe
24050 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e  ft=pSel; pLeft->
24060 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c  pPrior; pLeft=pL
24070 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  eft->pPrior);.  
24080 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74    pEList = pLeft
24090 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66  ->pEList;.    if
240a0 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b  ( pCte->pCols ){
240b0 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
240c0 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
240d0 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr!=pCte->pCols-
240e0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
240f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24100 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
24110 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65   %s has %d value
24120 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73  s for %d columns
24130 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
24140 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69  Cte->zName, pELi
24150 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d  st->nExpr, pCte-
24160 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20  >pCols->nExpr.  
24170 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
24180 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
24190 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20   pSavedWith;.   
241a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
241b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
241c0 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  }.      pEList =
241d0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20   pCte->pCols;.  
241e0 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
241f0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
24200 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
24210 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
24220 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
24230 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
24240 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66  sive ){.      if
24250 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ( pSel->selFlags
24260 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
24270 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  ){.        pCte-
24280 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74  >zCteErr = "mult
24290 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72  iple recursive r
242a0 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a  eferences: %s";.
242b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
242c0 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
242d0 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20  rr = "recursive 
242e0 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73  reference in a s
242f0 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20  ubquery: %s";.  
24300 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
24310 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
24320 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
24330 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43    }.    pCte->zC
24340 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  teErr = 0;.    p
24350 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
24360 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a  SavedWith;.  }..
24370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24380 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
24390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
243a0 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74  T_CTE./*.** If t
243b0 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64  he SELECT passed
243c0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
243d0 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61  rgument has an a
243e0 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a  ssociated WITH .
243f0 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69  ** clause, pop i
24400 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  t from the stack
24410 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
24420 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  of the Parse obj
24430 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
24440 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
24450 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43   as the xSelectC
24460 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62  allback2() callb
24470 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ack by.** sqlite
24480 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
24490 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53  when walking a S
244a0 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65  ELECT tree to re
244b0 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  solve table.** n
244c0 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46  ames and other F
244d0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
244e0 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  nts. .*/.static 
244f0 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69  void selectPopWi
24500 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  th(Walker *pWalk
24510 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
24520 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
24530 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
24540 65 3b 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  e;.  With *pWith
24550 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
24560 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66  (p)->pWith;.  if
24570 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20  ( pWith!=0 ){.  
24580 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
24590 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29  ->pWith==pWith )
245a0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
245b0 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75  ith = pWith->pOu
245c0 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  ter;.  }.}.#else
245d0 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50  .#define selectP
245e0 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a  opWith 0.#endif.
245f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
24600 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
24610 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
24620 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
24630 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
24640 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
24650 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
24660 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
24670 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
24680 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
24690 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
246a0 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
246b0 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
246c0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
246d0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
246e0 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
246f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
24700 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
24710 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
24720 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
24730 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
24740 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
24750 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
24760 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
24770 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
24780 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
24790 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
247a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
247b0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
247c0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
247d0 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
247e0 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
247f0 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
24800 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
24810 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
24820 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
24830 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
24840 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
24850 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
24860 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
24870 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
24880 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
24890 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
248a0 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
248b0 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
248c0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
248d0 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
248e0 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
248f0 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
24900 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
24910 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
24920 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
24930 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
24940 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
24950 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
24960 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
24970 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
24980 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
24990 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
249a0 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
249b0 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
249c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
249d0 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
249e0 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
249f0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
24a00 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
24a10 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
24a20 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
24a30 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
24a40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
24a50 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
24a60 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
24a70 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
24a80 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
24a90 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
24aa0 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
24ab0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
24ac0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
24ad0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
24ae0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
24af0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
24b00 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24b10 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
24b20 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
24b30 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
24b40 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73  elFlags;..  p->s
24b50 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
24b60 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62  panded;.  if( db
24b70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
24b80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
24b90 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  C_Abort;.  }.  i
24ba0 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63  f( NEVER(p->pSrc
24bb0 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67  ==0) || (selFlag
24bc0 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
24bd0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
24be0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
24bf0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
24c00 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
24c10 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
24c20 66 28 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c  f( pWalker->xSel
24c30 65 63 74 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65  ectCallback2==se
24c40 6c 65 63 74 50 6f 70 57 69 74 68 20 29 7b 0a 20  lectPopWith ){. 
24c50 20 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75     sqlite3WithPu
24c60 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52  sh(pParse, findR
24c70 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
24c80 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  th, 0);.  }..  /
24c90 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
24ca0 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
24cb0 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
24cc0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
24cd0 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
24ce0 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
24cf0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
24d00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
24d10 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
24d20 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
24d30 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
24d40 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
24d50 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
24d60 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
24d70 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
24d80 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
24d90 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
24da0 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
24db0 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
24dc0 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
24dd0 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
24de0 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
24df0 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
24e00 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
24e10 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
24e20 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
24e30 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
24e40 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
24e50 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
24e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
24e70 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
24e80 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e  ve==0 || pFrom->
24e90 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69  pTab!=0 );.    i
24ea0 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52  f( pFrom->fg.isR
24eb0 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69  ecursive ) conti
24ec0 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
24ed0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
24ee0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
24ef0 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69  E_OMIT_CTE.    i
24f00 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57  f( withExpand(pW
24f10 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20  alker, pFrom) ) 
24f20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
24f30 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
24f40 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a  >pTab ) {} else.
24f50 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
24f60 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
24f70 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
24f80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
24f90 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
24fa0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
24fb0 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
24fc0 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
24fd0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
24fe0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
24ff0 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
25000 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
25010 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
25020 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   );.      if( sq
25030 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
25040 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29  pWalker, pSel) )
25050 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25060 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  t;.      pFrom->
25070 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
25080 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
25090 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
250a0 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  le));.      if( 
250b0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
250c0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
250d0 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
250e0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
250f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
25100 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
25110 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29  _sq_%p", (void*)
25120 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
25130 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
25140 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
25150 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
25160 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
25170 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
25180 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
25190 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54  ,&pTab->nCol,&pT
251a0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->aCol);.     
251b0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
251c0 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  1;.      pTab->n
251d0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
251e0 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
251f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
25200 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54  576) );.      pT
25210 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
25220 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65  TF_Ephemeral;.#e
25230 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
25240 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
25250 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
25260 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
25270 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
25280 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25290 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
252a0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
252b0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
252c0 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
252d0 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d  pParse, 0, pFrom
252e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
252f0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
25300 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69  C_Abort;.      i
25310 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30  f( pTab->nRef==0
25320 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20  xffff ){.       
25330 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25340 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
25350 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ny references to
25360 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35   \"%s\": max 655
25370 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  35",.           
25380 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
25390 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
253a0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  b = 0;.        r
253b0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
253c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
253d0 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66  Tab->nRef++;.#if
253e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
253f0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
25400 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
25410 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
25420 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  E).      if( pTa
25430 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73  b->pSelect || Is
25440 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
25450 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f  .        i16 nCo
25460 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  l;.        if( s
25470 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
25480 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
25490 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
254a0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
254b0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
254c0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
254d0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 6f          if( pFro
254e0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
254f0 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
25500 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
25510 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25520 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69  (pParse, "'%s' i
25530 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e  s not a function
25540 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
25550 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
25560 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
25580 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
25590 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
255a0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
255b0 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
255c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
255d0 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c  Name(pFrom->pSel
255e0 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ect, pTab->zName
255f0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  );.        nCol 
25600 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
25610 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
25620 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73   = -1;.        s
25630 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
25640 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d  (pWalker, pFrom-
25650 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
25660 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
25670 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65  nCol;.      }.#e
25680 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
25690 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
256a0 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
256b0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
256c0 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
256d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
256e0 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
256f0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
25700 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
25710 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
25720 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
25730 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
25740 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
25750 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
25760 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
25770 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25780 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
25790 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
257a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
257b0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
257c0 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
257d0 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
257e0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
257f0 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
25800 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
25810 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
25820 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
25830 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
25840 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
25850 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
25860 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
25870 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
25880 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
25890 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
258a0 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
258b0 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
258c0 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
258d0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
258e0 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
258f0 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
25900 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
25910 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
25920 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
25930 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
25940 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
25950 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
25960 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
25970 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
25980 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
25990 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
259a0 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
259b0 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
259c0 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
259d0 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
259e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
259f0 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c  +){.    pE = pEL
25a00 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
25a10 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
25a20 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
25a30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
25a40 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
25a50 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
25a60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
25a70 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
25a80 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
25a90 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
25aa0 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
25ab0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
25ac0 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
25ad0 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
25ae0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
25af0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
25b00 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
25b10 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
25b20 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
25b30 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
25b40 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
25b50 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
25b60 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
25b70 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
25b80 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
25b90 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
25ba0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
25bb0 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
25bc0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
25bd0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
25be0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
25bf0 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
25c00 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
25c10 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
25c20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
25c30 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
25c40 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
25c50 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
25c60 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
25c90 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
25ca0 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
25cb0 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
25cc0 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
25cd0 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
25ce0 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  r;.      pRight 
25cf0 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
25d00 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
25d10 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
25d20 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
25d30 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
25d40 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d  ALL && (pE->op!=
25d50 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
25d60 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
25d70 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
25d80 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
25d90 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
25da0 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
25db0 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
25dc0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
25dd0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
25de0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
25df0 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a  w, a[k].pExpr);.
25e00 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
25e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
25e20 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
25e30 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
25e40 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
25e50 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
25e60 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20  >nExpr-1].zSpan 
25e70 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20  = a[k].zSpan;.  
25e80 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
25e90 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
25ea0 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30    a[k].zSpan = 0
25eb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25ec0 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
25ed0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
25ee0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
25ef0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
25f00 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
25f10 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
25f20 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
25f30 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
25f40 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
25f50 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
25f60 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
25f70 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
25f80 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
25f90 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
25fa0 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
25fb0 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
25fc0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
25fd0 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
25fe0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
25ff0 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
26000 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
26010 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
26020 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
26030 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
26040 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
26050 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
26060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26070 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
26080 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
26090 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
260a0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
260b0 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
260c0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
260d0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65  ab;.          Se
260e0 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72  lect *pSub = pFr
260f0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
26100 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
26110 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
26120 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
26130 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
26140 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  hemaName = 0;.  
26150 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
26160 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
26170 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TabName==0 ){.  
26180 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
26190 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
261a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
261b0 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
261c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
261d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
261e0 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28  if( pSub==0 || (
261f0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
26200 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
26210 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26220 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20    pSub = 0;.    
26230 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
26240 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  me && sqlite3Str
26250 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
26260 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  bName)!=0 ){.   
26270 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
26280 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
26290 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
262a0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
262b0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
262c0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
262d0 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
262e0 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f  aName = iDb>=0 ?
262f0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
26300 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
26310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26320 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
26330 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
26340 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
26350 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
26360 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
26370 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
26380 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
26390 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
263a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
263b0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
263c0 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
263d0 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
263e0 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
263f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
26400 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
26410 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
26420 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
26430 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
26440 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
26450 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
26460 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
26470 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
26480 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
26490 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
264a0 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
264b0 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
264c0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
264d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
264e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
264f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
26500 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
26510 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
26520 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
26530 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
26540 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
26550 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
26560 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
26570 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
26580 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
26590 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
265a0 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
265b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
265c0 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
265d0 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
265e0 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
265f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
26600 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
26610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
26620 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
26630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26640 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
26650 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
26660 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
26670 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
26680 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
26690 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
266a0 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
266c0 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
266d0 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
266e0 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
266f0 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26710 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
26720 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
26730 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
26740 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
26750 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
26760 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
26770 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
26780 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
26790 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
267a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
267b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
267c0 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
267d0 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
267e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
267f0 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
26800 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
26810 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
26820 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
26830 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
26840 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
26850 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
26860 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
26870 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
26880 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
26890 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
268a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
268b0 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
268c0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
268d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
268e0 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
268f0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
26900 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
26910 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
26920 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
26930 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
26940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
26950 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
26960 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
26970 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
26980 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
26990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
269a0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
269b0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
269c0 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
269d0 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
269e0 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65         if( zSche
269f0 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  maName ){.      
26a00 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
26a10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
26a20 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61  , TK_ID, zSchema
26a30 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
26a40 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
26a50 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
26a60 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
26a70 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  t, pExpr, 0);.  
26a80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26a90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26aa0 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
26ac0 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
26ad0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
26ae0 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
26af0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26b00 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
26b10 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
26b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26b30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26b40 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
26b50 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
26b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26b70 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
26b80 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
26b90 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
26ba0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
26bb0 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d      sColname.z =
26bc0 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
26bd0 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
26be0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
26bf0 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  n30(zColname);. 
26c00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26c10 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
26c20 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
26c30 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
26c40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
26c50 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  New && (p->selFl
26c60 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
26c70 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
26c80 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
26c90 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
26ca0 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65  X = &pNew->a[pNe
26cb0 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  w->nExpr-1];.   
26cc0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
26cd0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
26ce0 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
26cf0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
26d00 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  up(db, pSub->pEL
26d10 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29  ist->a[j].zSpan)
26d20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26d30 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
26d40 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
26d50 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
26d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26d70 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
26d80 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
26d90 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20  "%s.%s.%s",.    
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
26dd0 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43  me, zTabName, zC
26de0 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
26df0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
26e00 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
26e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26e20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
26e30 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20   pX->bSpanIsTab 
26e40 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
26e50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
26e60 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
26e70 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
26e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26e90 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
26ea0 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
26eb0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
26ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
26ed0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
26ee0 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
26ef0 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
26f00 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
26f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26f20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
26f30 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
26f40 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
26f50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26f70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26f80 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
26f90 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
26fa0 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
26fb0 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
26fc0 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
26fd0 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
26fe0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
26ff0 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
27000 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
27010 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
27020 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
27030 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
27040 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
27050 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
27060 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
27070 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
27080 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
27090 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
270a0 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
270b0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
270c0 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
270d0 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
270e0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
270f0 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
27100 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
27110 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
27120 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
27130 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
27140 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
27150 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
27160 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
27170 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
27180 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
27190 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
271a0 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
271b0 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
271c0 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
271d0 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
271e0 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
271f0 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
27200 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
27210 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
27220 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
27230 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
27240 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
27250 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nue;.}../*.** Th
27260 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
27270 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
27280 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
27290 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
272a0 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
272b0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
272c0 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
272d0 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
272e0 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
272f0 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
27300 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
27310 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
27320 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
27330 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
27340 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27350 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
27360 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
27370 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
27380 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
27390 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
273a0 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
273b0 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
273c0 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
273d0 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
273e0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
273f0 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
27400 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
27410 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
27420 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
27430 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
27440 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
27450 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
27460 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
27470 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
27480 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
27490 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
274a0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
274b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
274c0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
274d0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
274e0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
274f0 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
27500 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
27510 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
27520 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
27530 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50  pParse;.  if( pP
27540 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e  arse->hasCompoun
27550 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65  d ){.    w.xSele
27560 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e  ctCallback = con
27570 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
27580 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20  ctToSubquery;.  
27590 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
275a0 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
275b0 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63  ;.  }.  w.xSelec
275c0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
275d0 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 69 66  ctExpander;.  if
275e0 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
275f0 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
27600 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
27610 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
27620 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69  k2 = selectPopWi
27630 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  th;.  }.  sqlite
27640 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
27650 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
27660 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27670 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
27680 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
27690 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
276a0 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
276b0 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
276c0 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
276d0 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
276e0 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
276f0 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
27700 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
27710 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
27720 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
27730 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
27740 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
27750 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
27760 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
27770 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
27780 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
27790 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
277a0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
277b0 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
277c0 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
277d0 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
277e0 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
277f0 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
27800 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
27810 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
27820 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
27830 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
27840 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
27850 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
27860 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
27870 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
27880 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
27890 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
278a0 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
278b0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
278c0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
278d0 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
278e0 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
278f0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
27900 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27910 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
27920 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
27930 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
27940 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
27950 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
27960 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20  ypeInfo)==0 );. 
27970 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
27980 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
27990 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
279a0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54  er->pParse;.  pT
279b0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
279c0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  ;.  for(i=0, pFr
279d0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
279e0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
279f0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
27a00 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
27a10 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
27a20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
27a30 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
27a40 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
27a50 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
27a60 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
27a70 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
27a80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
27a90 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
27aa0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
27ab0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
27ac0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20  .      if( pSel 
27ad0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
27ae0 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
27af0 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
27b00 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65  rior;.        se
27b10 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
27b20 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
27b30 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
27b40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27b50 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
27b60 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
27b70 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
27b80 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
27b90 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
27ba0 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
27bb0 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
27bc0 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
27bd0 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
27be0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
27bf0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
27c00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
27c10 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
27c20 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
27c30 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
27c40 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
27c50 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
27c60 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
27c70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27c80 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
27c90 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
27ca0 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
27cb0 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  );.  w.xSelectCa
27cc0 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
27cd0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
27ce0 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
27cf0 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
27d00 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
27d10 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
27d20 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
27d30 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
27d40 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
27d50 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
27d60 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c  ne sets up a SEL
27d70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
27d80 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
27d90 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
27da0 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
27db0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
27dc0 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
27dd0 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
27de0 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
27df0 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
27e00 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
27e10 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
27e20 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
27e30 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
27e40 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
27e50 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
27e60 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
27e70 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
27e80 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
27e90 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
27ea0 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
27eb0 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
27ec0 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
27ed0 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
27ee0 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
27ef0 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
27f00 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
27f10 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
27f20 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
27f30 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
27f40 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
27f50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
27f60 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
27f70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
27f80 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
27f90 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
27fa0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
27fb0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
27fc0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
27fd0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
27fe0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
27ff0 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
28000 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
28010 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ner */.){.  sqli
28020 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e  te3 *db;.  if( N
28030 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
28040 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  urn;.  db = pPar
28050 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
28060 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
28070 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
28080 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
28090 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
280a0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
280b0 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72  electExpand(pPar
280c0 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50  se, p);.  if( pP
280d0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
280e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
280f0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
28100 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
28110 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ames(pParse, p, 
28120 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28  pOuterNC);.  if(
28130 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
28140 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28150 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
28160 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
28170 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  peInfo(pParse, p
28180 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  );.}../*.** Rese
28190 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
281a0 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
281b0 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
281c0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
281d0 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
281e0 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
281f0 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
28200 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
28210 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
28220 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
28230 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
28240 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f  es code that sto
28250 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
28260 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
28270 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  .** cells..*/.st
28280 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
28290 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
282a0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
282b0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
282c0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
282d0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
282e0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
282f0 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
28300 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67    int nReg = pAg
28310 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70  gInfo->nFunc + p
28320 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
28330 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20  ;.  if( nReg==0 
28340 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66  ) return;.#ifdef
28350 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
28360 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  /* Verify that a
28370 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73  ll AggInfo regis
28380 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20  ters are within 
28390 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66  the range specif
283a0 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49  ied by.  ** AggI
283b0 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e  nfo.mnReg..AggIn
283c0 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73  fo.mxReg */.  as
283d0 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67  sert( nReg==pAgg
283e0 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67  Info->mxReg-pAgg
283f0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b  Info->mnReg+1 );
28400 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
28410 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
28420 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
28430 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  t( pAggInfo->aCo
28440 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  l[i].iMem>=pAggI
28450 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
28460 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
28470 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  >aCol[i].iMem<=p
28480 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
28490 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
284a0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
284b0 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  nc; i++){.    as
284c0 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
284d0 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  aFunc[i].iMem>=p
284e0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
284f0 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
28500 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
28510 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
28520 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Reg );.  }.#endi
28530 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  f.  sqlite3VdbeA
28540 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
28550 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  , 0, pAggInfo->m
28560 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  nReg, pAggInfo->
28570 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46  mxReg);.  for(pF
28580 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
28590 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
285a0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
285b0 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
285c0 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
285d0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
285e0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
285f0 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
28600 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
28610 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
28620 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
28630 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
28640 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
28650 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
28660 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28670 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
28680 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
28690 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
286a0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
286b0 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
286c0 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
286d0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
286e0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
286f0 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
28700 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
28710 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
28720 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
28730 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a  x.pList, 0, 0);.
28740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28750 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
28760 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
28770 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
28780 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
287b0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
287c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
287d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
287e0 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
287f0 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
28800 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
28810 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
28820 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
28830 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
28840 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
28850 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
28860 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
28870 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
28880 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
28890 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
288a0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
288b0 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
288c0 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
288d0 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
288e0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
288f0 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
28900 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
28910 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
28920 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
28930 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
28940 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
28950 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
28960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28970 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  4(v, OP_AggFinal
28980 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
28990 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
289a0 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20   : 0, 0,.       
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
289c0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
289d0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
289e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
289f0 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
28a00 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  r memory cells f
28a10 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  or an aggregate 
28a20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
28a30 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
28a40 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
28a50 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
28a60 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
28a70 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
28a80 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
28a90 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
28aa0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
28ab0 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20  .  int regHit = 
28ac0 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74  0;.  int addrHit
28ad0 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  Test = 0;.  stru
28ae0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
28af0 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
28b00 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
28b10 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
28b20 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
28b30 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
28b40 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
28b50 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
28b60 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
28b70 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
28b80 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
28b90 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
28ba0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
28bb0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
28bc0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
28bd0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
28be0 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
28bf0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
28c00 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
28c10 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
28c20 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
28c30 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
28c40 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
28c50 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
28c60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28c70 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
28c80 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
28c90 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43  gg, 0, SQLITE_EC
28ca0 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c  EL_DUP);.    }el
28cb0 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  se{.      nArg =
28cc0 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67   0;.      regAgg
28cd0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
28ce0 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
28cf0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
28d00 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
28d10 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
28d20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28d30 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a  ( nArg==0 );  /*
28d40 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   Error condition
28d50 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
28d60 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20  se( nArg>1 );   
28d70 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72  /* Also an error
28d80 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69   */.      codeDi
28d90 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
28da0 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
28db0 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67  drNext, 1, regAg
28dc0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  g);.    }.    if
28dd0 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  ( pF->pFunc->fun
28de0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
28df0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
28e00 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
28e10 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
28e20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
28e30 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
28e40 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
28e50 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
28e60 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
28e70 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68  0 if pF->pFunc h
28e80 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20  as NEEDCOLL */. 
28e90 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
28ea0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
28eb0 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
28ec0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
28ed0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
28ee0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
28ef0 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
28f00 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
28f10 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
28f20 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
28f30 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
28f40 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
28f50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
28f60 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49  gHit==0 && pAggI
28f70 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
28f80 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70  r ) regHit = ++p
28f90 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
28fa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28fb0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
28fc0 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30  eq, regHit, 0, 0
28fd0 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
28fe0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
28ff0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
29000 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
29010 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67  AggStep0, 0, reg
29020 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20  Agg, pF->iMem,. 
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29040 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
29050 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
29060 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
29070 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
29080 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
29090 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
290a0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
290b0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
290c0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
290d0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
290e0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
290f0 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
29100 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
29110 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
29120 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
29130 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
29140 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
29150 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
29160 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
29170 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
29180 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
29190 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
291a0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
291b0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
291c0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
291d0 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
291e0 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
291f0 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
29200 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
29210 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
29220 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
29230 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
29240 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
29250 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
29260 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
29270 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
29280 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
29290 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
292a0 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
292b0 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
292c0 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
292d0 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
292e0 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
292f0 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
29300 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
29310 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
29320 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
29330 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
29340 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
29350 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
29360 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
29370 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
29380 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
29390 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
293a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
293b0 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
293c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
293d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
293e0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
293f0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
29400 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
29410 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
29420 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
29430 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
29440 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
29450 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
29460 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
29470 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
29480 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
29490 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
294a0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
294b0 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
294c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
294d0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
294e0 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
294f0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
29500 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
29510 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
29520 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
29530 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
29540 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
29550 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
29560 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
29570 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29580 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
29590 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
295a0 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
295b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
295c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
295d0 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
295e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29600 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
29610 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
29620 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29640 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
29650 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
29660 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
29670 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
29680 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
29690 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
296a0 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
296b0 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
296c0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
296d0 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ));.    char *zE
296e0 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
296f0 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
29700 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
29710 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
29720 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
29730 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
29740 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
29750 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
29760 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
29770 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
29780 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
29790 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
297a0 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
297b0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
297c0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
297d0 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
297e0 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
297f0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
29800 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
29810 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
29820 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
29830 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
29840 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29850 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
29860 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
29870 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
29880 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f  re returned acco
29890 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c  rding to the Sel
298a0 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
298b0 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
298c0 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ts in sqliteInt.
298d0 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e  h for further in
298e0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
298f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
29900 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
29910 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
29920 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
29930 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
29940 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
29950 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
29960 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
29970 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
29980 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29990 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
299a0 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
299b0 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
299c0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
299d0 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
299e0 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
299f0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
29a00 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
29a10 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
29a20 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
29a30 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a50 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
29a60 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
29a70 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
29a80 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
29a90 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
29aa0 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
29ab0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
29ac0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
29ad0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
29ae0 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
29af0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
29b00 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
29b10 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
29b20 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b40 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
29b50 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
29b60 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
29b70 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
29b80 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
29b90 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
29ba0 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
29bb0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
29bc0 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74  st = 0;  /* List
29bd0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
29be0 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
29bf0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
29c00 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
29c10 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
29c20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
29c30 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
29c40 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE 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 4c 69 73 74  LL */.  ExprList
29c70 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
29c80 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
29c90 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
29ca0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
29cb0 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
29cc0 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
29cd0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
29ce0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
29cf0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
29d00 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
29d10 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
29d20 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e  tion */.  Distin
29d30 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b  ctCtx sDistinct;
29d40 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
29d50 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54  to code the DIST
29d60 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  INCT keyword */.
29d70 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b    SortCtx sSort;
29d80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
29d90 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
29da0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
29db0 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  use */.  AggInfo
29dc0 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
29dd0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
29de0 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
29df0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
29e00 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
29e10 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
29e20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
29e30 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
29e40 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
29e50 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
29e60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
29e70 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
29e80 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
29e90 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
29ea0 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
29eb0 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
29ec0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
29ed0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
29ee0 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
29ef0 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
29f00 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
29f10 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
29f20 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
29f30 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
29f40 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
29f50 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
29f60 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
29f70 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
29f80 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
29f90 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
29fa0 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
29fb0 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  fo));.#if SELECT
29fc0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
29fd0 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
29fe0 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43  ndent++;.  SELEC
29ff0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
2a000 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65  p, ("begin proce
2a010 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69  ssing:\n"));.  i
2a020 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2a030 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2a040 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2a050 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2a060 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2a070 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2a080 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2a090 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2a0a0 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
2a0b0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2a0c0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2a0d0 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
2a0e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2a0f0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2a100 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2a110 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
2a120 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
2a130 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
2a140 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
2a150 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
2a160 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
2a170 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
2a180 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a190 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
2a1a0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
2a1b0 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
2a1c0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2a1d0 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
2a1e0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a1f0 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
2a200 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2a210 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
2a220 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2a230 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
2a240 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2a250 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2a260 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
2a270 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
2a280 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
2a290 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
2a2a0 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
2a2b0 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
2a2c0 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
2a2d0 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
2a2e0 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
2a2f0 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
2a300 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2a310 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
2a320 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
2a330 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
2a340 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
2a350 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
2a360 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
2a370 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
2a380 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
2a390 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
2a3a0 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
2a3b0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
2a3c0 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
2a3d0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
2a3e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2a3f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2a400 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
2a410 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61  ect_end;.  }.  a
2a420 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
2a430 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d  !=0 );.  isAgg =
2a440 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2a450 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
2a460 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2a470 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2a480 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2a490 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2a4a0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2a4b0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  100,pParse,p, ("
2a4c0 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
2a4d0 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ution:\n"));.   
2a4e0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2a4f0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2a500 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20  .  }.#endif...  
2a510 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
2a520 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
2a530 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
2a540 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
2a550 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
2a560 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  put..  */.#ifnde
2a570 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
2a580 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65  BQUERY.  if( che
2a590 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
2a5a0 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
2a5b0 73 65 2c 20 70 44 65 73 74 2c 20 70 2d 3e 70 45  se, pDest, p->pE
2a5c0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
2a5d0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2a5e0 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
2a5f0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c 61  .  /* Try to fla
2a600 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
2a610 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a620 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d  se up into the m
2a630 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23  ain query.  */.#
2a640 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2a650 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2a660 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
2a670 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
2a680 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
2a690 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
2a6a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
2a6b0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2a6c0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
2a6d0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
2a6e0 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ];.    Select *p
2a6f0 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
2a700 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
2a710 41 67 67 53 75 62 3b 0a 20 20 20 20 54 61 62 6c  AggSub;.    Tabl
2a720 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
2a730 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
2a740 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
2a750 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68  e;..    /* Catch
2a760 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65   mismatch in the
2a770 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
2a780 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20  s of a view and 
2a790 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
2a7a0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
2a7b0 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68  the SELECT on th
2a7c0 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28  e RHS */.    if(
2a7d0 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75   pTab->nCol!=pSu
2a7e0 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
2a7f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2a800 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2a810 2c 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63  , "expected %d c
2a820 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20  olumns for '%s' 
2a830 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20  but got %d",.   
2a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a850 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70     pTab->nCol, p
2a860 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62  Tab->zName, pSub
2a870 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
2a880 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  ;.      goto sel
2a890 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
2a8a0 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
2a8b0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2a8c0 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
2a8d0 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
2a8e0 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
2a8f0 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
2a900 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
2a910 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75     /* This subqu
2a920 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
2a930 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72  bed into its par
2a940 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ent. */.      if
2a950 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
2a960 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
2a970 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
2a980 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
2a990 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
2a9a0 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
2a9b0 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
2a9c0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
2a9d0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2a9e0 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2a9f0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49  _end;.    if( !I
2aa00 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
2aa10 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
2aa20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2aa30 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
2aa40 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2aa50 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
2aa60 65 72 20 74 68 65 20 56 44 42 45 20 75 6e 64 65  er the VDBE unde
2aa70 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20  r construction, 
2aa80 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
2aa90 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a   VDBE if one.  *
2aaa0 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  * does not alrea
2aab0 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20  dy exist */.  v 
2aac0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
2aad0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2aae0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
2aaf0 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e 64 65 66  ct_end;..#ifndef
2ab00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
2ab10 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
2ab20 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e  * Handle compoun
2ab30 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
2ab40 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20 73 65  nts using the se
2ab50 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65  parate multiSele
2ab60 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64  ct().  ** proced
2ab70 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ure..  */.  if( 
2ab80 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
2ab90 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
2aba0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
2abb0 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  st);.    explain
2abc0 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
2abd0 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
2abe0 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
2abf0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2ac00 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c  _ENABLED.    SEL
2ac10 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
2ac20 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75  e,p,("end compou
2ac30 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73  nd-select proces
2ac40 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70  sing\n"));.    p
2ac50 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
2ac60 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20  dent--;.#endif. 
2ac70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ac80 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
2ac90 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2aca0 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
2acb0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2acc0 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  use.  */.#if !de
2acd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2ace0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
2acf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2ad00 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28  MIT_VIEW).  for(
2ad10 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
2ad20 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2ad30 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2ad40 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
2ad50 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
2ad60 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
2ad70 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
2ad80 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
2ad90 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70  elect;.    if( p
2ada0 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
2adb0 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74  e;..    /* Somet
2adc0 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  imes the code fo
2add0 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c  r a subquery wil
2ade0 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d  l be generated m
2adf0 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ore than.    ** 
2ae00 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62  once, if the sub
2ae10 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
2ae20 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2ae30 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e in a LEFT JOIN
2ae40 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61  ,.    ** for exa
2ae50 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  mple.  In that c
2ae60 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65  ase, do not rege
2ae70 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
2ae80 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20  to manifest.    
2ae90 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65  ** a view or the
2aea0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69   co-routine to i
2aeb0 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e  mplement a view.
2aec0 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74    The first inst
2aed0 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  ance.    ** is s
2aee0 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67  ufficient, thoug
2aef0 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  h the subroutine
2af00 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65   to manifest the
2af10 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a   view does need.
2af20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76      ** to be inv
2af30 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  oked again. */. 
2af40 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64     if( pItem->ad
2af50 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20  drFillSub ){.   
2af60 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2af70 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  .viaCoroutine==0
2af80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2af90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2afa0 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
2afb0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
2afc0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
2afd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2afe0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2aff0 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
2b000 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
2b010 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
2b020 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
2b030 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
2b040 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
2b050 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
2b060 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
2b070 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
2b080 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
2b090 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
2b0a0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
2b0b0 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
2b0c0 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
2b0d0 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
2b0e0 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
2b0f0 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
2b100 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
2b110 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
2b120 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
2b130 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
2b140 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
2b150 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
2b160 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
2b170 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2b180 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
2b190 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63  Make copies of c
2b1a0 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c  onstant WHERE-cl
2b1b0 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68  ause terms in th
2b1c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
2b1d0 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65  wn.    ** inside
2b1e0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
2b1f0 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68  This can help th
2b200 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75  e subquery to ru
2b210 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  n more efficient
2b220 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2b230 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  f( (pItem->fg.jo
2b240 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
2b250 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 75  R)==0.     && pu
2b260 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
2b270 28 64 62 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57  (db, pSub, p->pW
2b280 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
2b290 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69 66  rsor).    ){.#if
2b2a0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2b2b0 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73  BLED.      if( s
2b2c0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2b2d0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2b2e0 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
2b2f0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2b300 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c  ("After WHERE-cl
2b310 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c  ause push-down:\
2b320 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n"));.        sq
2b330 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2b340 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2b350 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2b360 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
2b370 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  ate code to impl
2b380 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65  ement the subque
2b390 72 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ry.    */.    if
2b3a0 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
2b3b0 3d 3d 31 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  ==1.     && (p->
2b3c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 6c  selFlags & SF_Al
2b3d0 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70  l)==0.     && Op
2b3e0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2b3f0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62  d(db, SQLITE_Sub
2b400 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20  qCoroutine).    
2b410 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
2b420 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
2b430 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
2b440 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
2b450 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
2b460 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
2b470 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
2b480 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2b490 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
2b4a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2b4b0 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 20  ddr(v)+1;.      
2b4c0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2b4d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2b4e0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
2b4f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2b500 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
2b510 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2b520 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
2b530 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2b540 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  ((v, "%s", pItem
2b550 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2b560 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
2b570 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72  drFillSub = addr
2b580 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Top;.      sqlit
2b590 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
2b5a0 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
2b5b0 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
2b5c0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2b5d0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2b5e0 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
2b5f0 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
2b600 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
2b610 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2b620 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
2b630 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
2b640 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
2b650 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65  wLogEst = sqlite
2b660 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e 53  3LogEst(pSub->nS
2b670 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
2b680 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
2b690 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20  routine = 1;.   
2b6a0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73     pItem->regRes
2b6b0 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  ult = dest.iSdst
2b6c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2b6d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2b6e0 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  EndCoroutine, pI
2b6f0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2b700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2b710 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2b720 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  drTop-1);.      
2b730 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2b740 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
2b750 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b760 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
2b770 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2b780 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70   will fill an ep
2b790 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2b7a0 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  th.      ** the 
2b7b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
2b7c0 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d  subquery.  pItem
2b7d0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69  ->addrFillSub wi
2b7e0 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a  ll point.      *
2b7f0 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  * to the address
2b800 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
2b810 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70  d subroutine.  p
2b820 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a  Item->regReturn.
2b830 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65        ** is a re
2b840 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64  gister allocated
2b850 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62   to hold the sub
2b860 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
2b870 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a  ddress.      */.
2b880 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64        int topAdd
2b890 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  r;.      int onc
2b8a0 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  eAddr = 0;.     
2b8b0 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20   int retAddr;.  
2b8c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2b8d0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
2b8e0 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
2b8f0 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
2b900 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2b910 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
2b920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b930 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2b940 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2b950 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
2b960 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2b970 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
2b980 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
2b990 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
2b9a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2b9b0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
2b9c0 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
2b9d0 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
2b9e0 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
2b9f0 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
2ba00 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
2ba10 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
2ba20 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
2ba30 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
2ba40 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
2ba50 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
2ba60 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
2ba70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
2ba80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2ba90 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2baa0 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22   "materialize \"
2bab0 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54  %s\"", pItem->pT
2bac0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
2bad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bae0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
2baf0 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
2bb00 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
2bb10 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2bb20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bb30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
2bb40 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
2bb50 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
2bb60 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2bb70 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2bb80 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
2bb90 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
2bba0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
2bbb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2bbc0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
2bbd0 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
2bbe0 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
2bbf0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69  RowLogEst = sqli
2bc00 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e  te3LogEst(pSub->
2bc10 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
2bc20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20     if( onceAddr 
2bc30 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
2bc40 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64  pHere(v, onceAdd
2bc50 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64  r);.      retAdd
2bc60 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2bc70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2bc80 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  rn, pItem->regRe
2bc90 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  turn);.      Vdb
2bca0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
2bcb0 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  d %s", pItem->pT
2bcc0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
2bcd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2bce0 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64  angeP1(v, topAdd
2bcf0 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20  r, retAddr);.   
2bd00 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
2bd10 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
2bd20 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  se);.    }.    i
2bd30 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2bd40 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
2bd50 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73  t_end;.    pPars
2bd60 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
2bd70 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2bd80 65 69 67 68 74 28 70 29 3b 0a 20 20 7d 0a 23 65  eight(p);.  }.#e
2bd90 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 61 72 69 6f  ndif..  /* Vario
2bda0 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  us elements of t
2bdb0 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64  he SELECT copied
2bdc0 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69   into local vari
2bdd0 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63  ables for.  ** c
2bde0 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20  onvenience */.  
2bdf0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
2be00 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  st;.  pWhere = p
2be10 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
2be20 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2be30 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
2be40 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
2be50 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
2be60 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2be70 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
2be80 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
2be90 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2bea0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2beb0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
2bec0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2bed0 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
2bee0 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  fter all FROM-cl
2bef0 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  ause analysis:\n
2bf00 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
2bf10 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2bf20 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2bf30 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
2bf40 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e   query is DISTIN
2bf50 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
2bf60 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61   BY but is not a
2bf70 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64  n aggregate, and
2bf80 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65   .  ** if the se
2bf90 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65  lect-list is the
2bfa0 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44   same as the ORD
2bfb0 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e  ER BY list, then
2bfc0 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a   this query.  **
2bfd0 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
2bfe0 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e  n as a GROUP BY.
2bff0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2c000 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
2c010 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
2c020 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  INCT xyz FROM ..
2c030 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  . ORDER BY xyz. 
2c040 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e   **.  ** is tran
2c050 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a  sformed to:.  **
2c060 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2c070 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52   xyz FROM ... GR
2c080 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52  OUP BY xyz ORDER
2c090 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
2c0a0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
2c0b0 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61  m is preferred a
2c0c0 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
2c0d0 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29   (or temp-table)
2c0e0 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73   may be .  ** us
2c0f0 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
2c100 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53  ORDER BY and DIS
2c110 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67  TINCT processing
2c120 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20  . As originally 
2c130 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68  .  ** written th
2c140 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65  e query must use
2c150 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f   a temp-table fo
2c160 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  r at least one o
2c170 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a  f the ORDER .  *
2c180 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  * BY and DISTINC
2c190 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  T, and an index 
2c1a0 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70  or separate temp
2c1b0 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f  -table for the o
2c1c0 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
2c1d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2c1e0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
2c1f0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
2c200 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20  Distinct .   && 
2c210 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2c220 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72  ompare(sSort.pOr
2c230 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d  derBy, pEList, -
2c240 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  1)==0.  ){.    p
2c250 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2c260 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
2c270 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
2c280 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
2c290 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
2c2a0 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  pEList, 0);.    
2c2b0 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
2c2c0 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
2c2d0 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
2c2e0 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
2c2f0 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
2c300 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
2c310 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
2c320 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
2c330 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
2c340 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
2c350 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
2c360 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
2c370 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
2c380 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
2c390 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
2c3a0 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20  inct.isTnct );. 
2c3b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2c3c0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2c3d0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72   clause, then cr
2c3e0 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
2c3f0 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20  l index to.  ** 
2c400 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20  do the sorting. 
2c410 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e   But this sortin
2c420 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  g ephemeral inde
2c430 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20  x might end up. 
2c440 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64   ** being unused
2c450 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
2c460 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e   be extracted in
2c470 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
2c480 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20  r..  ** If that 
2c490 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
2c4a0 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  n the OP_OpenEph
2c4b0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
2c4c0 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
2c4d0 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
2c4e0 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69  _Noop once we fi
2c4f0 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
2c500 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2c510 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64  is.  ** not need
2c520 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61  ed.  The sSort.a
2c530 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72  ddrSortIndex var
2c540 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2c550 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a   facilitate.  **
2c560 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
2c570 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
2c580 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
2c590 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2c5a0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
2c5b0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2c5c0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
2c5d0 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
2c5e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2c5f0 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
2c600 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
2c610 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
2c620 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
2c630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c640 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2c650 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
2c660 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
2c670 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
2c680 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
2c690 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
2c6a0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2c6b0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2c6c0 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
2c6d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
2c6e0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
2c6f0 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
2c700 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
2c710 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
2c720 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
2c730 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
2c740 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
2c750 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
2c760 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
2c770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2c780 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2c790 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
2c7a0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
2c7b0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
2c7c0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
2c7d0 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
2c7e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2c7f0 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
2c800 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53  lectRow = LARGES
2c810 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75  T_INT64;.  compu
2c820 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
2c830 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
2c840 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
2c850 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61  it==0 && sSort.a
2c860 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
2c870 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2c880 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76  beChangeOpcode(v
2c890 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
2c8a0 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72  Index, OP_Sorter
2c8b0 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74  Open);.    sSort
2c8c0 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f  .sortFlags |= SO
2c8d0 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
2c8e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2c8f0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2c900 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
2c910 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
2c920 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
2c930 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
2c940 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69  tinct ){.    sDi
2c950 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d  stinct.tabTnct =
2c960 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2c970 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61  .    sDistinct.a
2c980 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65  ddrTnct = sqlite
2c990 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2c9a0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2c9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44                sD
2c9d0 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c  istinct.tabTnct,
2c9e0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca00 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e      (char*)keyIn
2ca10 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2ca20 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
2ca30 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20  ,0,0),.         
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
2ca60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ca70 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
2ca80 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
2ca90 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
2caa0 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
2cab0 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
2cac0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2cad0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2cae0 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
2caf0 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
2cb00 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
2cb10 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
2cb20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
2cb30 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
2cb40 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
2cb50 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63  se */.    u16 wc
2cb60 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73  trlFlags = (sDis
2cb70 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57  tinct.isTnct ? W
2cb80 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
2cb90 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  CT : 0);..    /*
2cba0 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
2cbb0 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ase scan. */.   
2cbc0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2cbd0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
2cbe0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
2cbf0 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  here, sSort.pOrd
2cc00 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
2cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20       p->pEList, 
2cc30 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b 0a  wctrlFlags, 0);.
2cc40 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
2cc50 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2cc60 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  end;.    if( sql
2cc70 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
2cc80 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20  owCount(pWInfo) 
2cc90 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  < p->nSelectRow 
2cca0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  ){.      p->nSel
2ccb0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
2ccc0 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
2ccd0 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  unt(pWInfo);.   
2cce0 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74   }.    if( sDist
2ccf0 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73  inct.isTnct && s
2cd00 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
2cd10 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b  tinct(pWInfo) ){
2cd20 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74  .      sDistinct
2cd30 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c  .eTnctType = sql
2cd40 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
2cd50 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  nct(pWInfo);.   
2cd60 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74   }.    if( sSort
2cd70 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2cd80 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20     sSort.nOBSat 
2cd90 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2cda0 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b  Ordered(pWInfo);
2cdb0 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74  .      if( sSort
2cdc0 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70  .nOBSat==sSort.p
2cdd0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
2cde0 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e  {.        sSort.
2cdf0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2ce00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2ce10 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
2ce20 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
2ce30 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
2ce40 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2ce50 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
2ce60 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
2ce70 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
2ce80 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
2ce90 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2cea0 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
2ceb0 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
2cec0 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61  .    if( sSort.a
2ced0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
2cee0 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  && sSort.pOrderB
2cef0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
2cf00 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
2cf10 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
2cf20 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
2cf30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
2cf40 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
2cf50 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20  ner loop. */.   
2cf60 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2cf70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
2cf80 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20  st, -1, &sSort, 
2cf90 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
2cfa0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2cfb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2cfc0 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
2cfd0 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  (pWInfo),.      
2cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2cff0 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
2d000 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a  abel(pWInfo));..
2d010 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
2d020 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
2d030 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
2d040 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2d050 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
2d060 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
2d070 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   when there exis
2d080 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
2d090 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50  tions or a GROUP
2d0a0 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a   BY clause.    *
2d0b0 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20  * or both */.   
2d0c0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
2d0d0 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
2d0e0 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
2d0f0 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
2d100 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
2d110 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
2d120 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
2d130 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
2d140 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
2d150 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
2d160 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
2d170 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
2d180 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
2d190 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
2d1a0 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
2d1b0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
2d1c0 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
2d1d0 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
2d1e0 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
2d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d200 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
2d210 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
2d220 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
2d230 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
2d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d250 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
2d260 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
2d270 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
2d280 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
2d290 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
2d2a0 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
2d2b0 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
2d2c0 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
2d2d0 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
2d2e0 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
2d2f0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
2d300 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
2d310 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
2d320 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
2d330 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  T */.    int sor
2d340 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  tPTab = 0;   /* 
2d350 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64  Pseudotable used
2d360 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69   to decode sorti
2d370 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ng results */.  
2d380 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20    int sortOut = 
2d390 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  0;    /* Output 
2d3a0 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68  register from th
2d3b0 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
2d3c0 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d  int orderByGrp =
2d3d0 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74   0; /* True if t
2d3e0 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  he GROUP BY and 
2d3f0 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68 65  ORDER BY are the
2d400 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   same */..    /*
2d410 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
2d420 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
2d430 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
2d440 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
2d450 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
2d460 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2d470 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
2d480 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4a0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2d4b0 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
2d4c0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2d4d0 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
2d4e0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
2d4f0 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
2d500 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
2d510 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
2d520 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
2d530 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
2d540 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2d550 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
2d560 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
2d570 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
2d580 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
2d590 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
2d5a0 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
2d5b0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
2d5c0 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
2d5d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2d5e0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
2d5f0 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e  ctRow>100 ) p->n
2d600 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b  SelectRow = 100;
2d610 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d620 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2d630 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
2d640 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
2d650 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61  oth a GROUP BY a
2d660 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  nd an ORDER BY c
2d670 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61  lause and they a
2d680 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69  re.    ** identi
2d690 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  cal, then it may
2d6a0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2d6b0 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
2d6c0 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20  R BY clause .   
2d6d0 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e   ** on the groun
2d6e0 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55  ds that the GROU
2d6f0 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20  P BY will cause 
2d700 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
2d710 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20   out .    ** in 
2d720 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
2d730 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e  r. It also may n
2d740 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42  ot - the GROUP B
2d750 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20  Y might use a.  
2d760 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e    ** database in
2d770 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20  dex that causes 
2d780 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70  rows to be group
2d790 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72  ed together as r
2d7a0 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62  equired.    ** b
2d7b0 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
2d7c0 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77  sorted. Either w
2d7d0 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ay, record the f
2d7e0 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20  act that the.   
2d7f0 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64   ** ORDER BY and
2d800 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2d810 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62  s are the same b
2d820 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72  y setting the or
2d830 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20  derByGrp.    ** 
2d840 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
2d850 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2d860 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72  rListCompare(pGr
2d870 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72  oupBy, sSort.pOr
2d880 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b  derBy, -1)==0 ){
2d890 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72  .      orderByGr
2d8a0 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20  p = 1;.    }. . 
2d8b0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
2d8c0 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
2d8d0 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
2d8e0 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
2d8f0 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
2d900 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2d910 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
2d920 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
2d930 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
2d940 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
2d950 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
2d960 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
2d970 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
2d980 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
2d990 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
2d9a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
2d9b0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
2d9c0 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
2d9d0 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
2d9e0 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
2d9f0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2da00 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
2da10 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
2da20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
2da30 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
2da40 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20  AggInfo.mnReg = 
2da50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2da60 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
2da70 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
2da80 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
2da90 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
2daa0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
2dab0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
2dac0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2dad0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2dae0 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
2daf0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2db00 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
2db10 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29   sSort.pOrderBy)
2db20 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
2db30 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
2db40 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2db50 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
2db60 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
2db70 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
2db80 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
2db90 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
2dba0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2dbb0 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
2dbc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2dbd0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2dbe0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
2dbf0 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
2dc00 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2dc10 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
2dc20 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
2dc30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2dc40 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
2dc50 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
2dc60 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
2dc70 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  ist);.      sNC.
2dc80 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49  ncFlags &= ~NC_I
2dc90 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a  nAggFunc;.    }.
2dca0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52      sAggInfo.mxR
2dcb0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2dcc0 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  m;.    if( db->m
2dcd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2dce0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
2dcf0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
2dd00 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
2dd10 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
2dd20 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
2dd30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
2dd40 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
2dd50 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
2dd60 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
2dd70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2dd80 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
2dd90 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2dda0 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
2ddb0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
2ddc0 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
2ddd0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
2dde0 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
2ddf0 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
2de00 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
2de10 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
2de20 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
2de30 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
2de40 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
2de50 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
2de60 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
2de70 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
2de80 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
2de90 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
2dea0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
2deb0 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
2dec0 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
2ded0 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
2dee0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
2def0 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
2df00 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
2df10 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
2df20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
2df30 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
2df40 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2df50 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
2df60 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
2df70 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
2df80 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
2df90 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
2dfa0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2dfb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2dfc0 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
2dfd0 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2dfe0 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
2dff0 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
2e000 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2e010 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
2e020 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
2e030 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
2e040 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
2e050 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
2e060 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
2e070 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
2e080 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
2e090 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
2e0a0 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
2e0b0 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
2e0c0 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
2e0d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
2e0e0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
2e0f0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
2e100 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
2e110 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2e120 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
2e130 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2e140 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2e150 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2e160 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2e170 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  y, 0, sAggInfo.n
2e180 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
2e190 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
2e1a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e1b0 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
2e1c0 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
2e1d0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2e1e0 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
2e1f0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
2e200 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
2e210 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2e220 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
2e230 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
2e240 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
2e250 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
2e260 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
2e270 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
2e280 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
2e290 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2e2a0 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
2e2b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2e2c0 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
2e2d0 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
2e2e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2e2f0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2e300 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2e310 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
2e320 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
2e330 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2e340 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
2e350 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2e360 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
2e370 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2e380 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2e390 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2e3a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
2e3b0 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
2e3c0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2e3d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2e3e0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2e3f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e400 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2e410 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
2e420 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2e430 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
2e440 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
2e450 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e460 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e470 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
2e480 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2e490 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2e4a0 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
2e4b0 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
2e4c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e4d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2e4e0 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65  , 0, iAMem, iAMe
2e4f0 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  m+pGroupBy->nExp
2e500 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r-1);..      /* 
2e510 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
2e520 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
2e530 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
2e540 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
2e550 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
2e560 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
2e570 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
2e580 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
2e590 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
2e5a0 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2e5b0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
2e5c0 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
2e5d0 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
2e5e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
2e5f0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
2e600 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
2e610 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
2e620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e630 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2e640 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2e650 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2e660 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2e670 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2e680 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2e690 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c  Where, pGroupBy,
2e6a0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48   0,.          WH
2e6b0 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f  ERE_GROUPBY | (o
2e6c0 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45 52  rderByGrp ? WHER
2e6d0 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20  E_SORTBYGROUP : 
2e6e0 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  0), 0.      );. 
2e6f0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
2e700 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2e710 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
2e720 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
2e730 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70  dered(pWInfo)==p
2e740 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29  GroupBy->nExpr )
2e750 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2e760 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
2e770 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
2e780 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
2e790 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
2e7a0 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
2e7b0 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
2e7c0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2e7d0 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
2e7e0 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
2e7f0 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
2e800 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
2e810 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
2e820 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
2e830 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
2e840 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
2e850 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2e860 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
2e870 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
2e880 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
2e890 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
2e8a0 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
2e8b0 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
2e8c0 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
2e8d0 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
2e8e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2e8f0 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
2e900 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
2e910 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
2e920 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
2e930 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
2e940 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
2e950 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
2e960 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
2e970 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
2e980 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
2e990 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
2e9a0 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
2e9b0 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2e9c0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2e9d0 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2e9e0 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
2e9f0 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d  s&SF_Distinct)==
2ea00 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
2ea10 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
2ea20 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22  CT" : "GROUP BY"
2ea30 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
2ea40 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
2ea50 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
2ea60 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2ea70 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
2ea80 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2ea90 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2eaa0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2eab0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2eac0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2ead0 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
2eae0 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
2eaf0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2eb00 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
2eb10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
2eb20 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2eb30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2eb40 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
2eb50 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
2eb60 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
2eb70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2eb80 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2eb90 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2eba0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
2ebb0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
2ebc0 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
2ebd0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  0, 0);.        j
2ebe0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2ebf0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2ec00 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2ec10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2ec20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2ec30 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
2ec40 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
2ec50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2ec60 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2ec70 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
2ec80 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
2ec90 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
2eca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2ecb0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
2ecc0 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Reg(pParse, .   
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ece0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2ecf0 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
2ed00 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
2ed10 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ble, r1);.      
2ed20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2ed30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ed40 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
2ed50 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
2ed60 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2ed70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2ed80 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2ed90 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
2eda0 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
2edb0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2edc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2edd0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
2ede0 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
2edf0 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
2ee00 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2ee10 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2ee20 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
2ee30 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2ee40 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2ee50 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2ee60 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
2ee70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2ee80 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2ee90 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2eea0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  o.sortingIdxPTab
2eeb0 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50   = sortPTab = pP
2eec0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2eed0 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20        sortOut = 
2eee0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2eef0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
2ef00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ef10 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
2ef20 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c  seudo, sortPTab,
2ef30 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b   sortOut, nCol);
2ef40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ef50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2ef60 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67  _SorterSort, sAg
2ef70 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2ef80 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
2ef90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2efa0 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
2efb0 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72  rt")); VdbeCover
2efc0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2efd0 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
2efe0 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
2eff0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2f000 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2f010 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  );..      }..   
2f020 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
2f030 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  ex or temporary 
2f040 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68  table used by th
2f050 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a  e GROUP BY sort.
2f060 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61        ** will na
2f070 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20  turally deliver 
2f080 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65  rows in the orde
2f090 72 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  r required by th
2f0a0 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20  e ORDER BY.     
2f0b0 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63   ** clause, canc
2f0c0 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  el the ephemeral
2f0d0 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65   table open code
2f0e0 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20  d earlier..     
2f0f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
2f100 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
2f110 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
2f120 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
2f130 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
2f140 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65  ss..      ** Use
2f150 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
2f160 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
2f170 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
2f180 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20  RL_OPTIMIZER to 
2f190 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
2f1a0 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  e this optimizat
2f1b0 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ion for testing 
2f1c0 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20  purposes.  */.  
2f1d0 20 20 20 20 69 66 28 20 6f 72 64 65 72 42 79 47      if( orderByG
2f1e0 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  rp && Optimizati
2f1f0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2f200 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
2f210 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 67  r) .       && (g
2f220 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71  roupBySort || sq
2f230 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
2f240 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20  ed(pWInfo)).    
2f250 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f    ){.        sSo
2f260 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2f270 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f280 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
2f290 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2f2a0 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
2f2b0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
2f2c0 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
2f2d0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2f2e0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
2f2f0 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
2f300 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
2f310 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
2f320 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
2f330 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
2f340 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
2f350 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
2f360 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
2f370 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
2f380 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
2f390 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
2f3a0 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
2f3b0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
2f3c0 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
2f3d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
2f3e0 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
2f3f0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2f400 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2f410 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2f420 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2f430 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2f440 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2f450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2f460 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
2f470 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2f480 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4a0 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50 54   sortOut, sortPT
2f4b0 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
2f4c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
2f4d0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
2f4e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2f4f0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2f500 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2f510 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f520 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54  P_Column, sortPT
2f530 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  ab, j, iBMem+j);
2f540 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2f550 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
2f560 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
2f570 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
2f580 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2f590 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
2f5a0 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
2f5b0 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
2f5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2f5d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2f5e0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
2f5f0 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
2f600 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
2f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f620 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
2f630 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
2f640 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
2f650 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64  YINFO);.      ad
2f660 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
2f670 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2f680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f690 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
2f6a0 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c  ump, addr1+1, 0,
2f6b0 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
2f6c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
2f6d0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
2f6e0 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
2f6f0 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50  enever the GROUP
2f700 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   BY changes..   
2f710 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e     ** Changes in
2f720 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
2f730 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
2f740 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
2f750 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
2f760 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
2f770 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
2f780 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
2f790 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2f7a0 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
2f7b0 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
2f7c0 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
2f7d0 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
2f7e0 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
2f7f0 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
2f800 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
2f810 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
2f820 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
2f830 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
2f840 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
2f850 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
2f860 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
2f870 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
2f880 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
2f890 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
2f8a0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
2f8b0 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d  se, iBMem, iAMem
2f8c0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
2f8d0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2f8e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f8f0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
2f900 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
2f910 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
2f920 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
2f930 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b  tput one row"));
2f940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f950 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2f960 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67  fPos, iAbortFlag
2f970 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65  , addrEnd); Vdbe
2f980 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2f990 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2f9a0 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
2f9b0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2f9c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2f9d0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2f9e0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
2f9f0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
2fa00 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
2fa10 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
2fa20 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
2fa30 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
2fa40 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
2fa50 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
2fa60 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
2fa70 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
2fa80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2fa90 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2faa0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
2fab0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
2fac0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2fad0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
2fae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2faf0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
2fb00 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
2fb10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2fb20 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
2fb30 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
2fb40 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
2fb50 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
2fb60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2fb70 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2fb80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fb90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fba0 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
2fbb0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2fbc0 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
2fbd0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2fbe0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2fbf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fc00 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2fc10 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
2fc20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2fc30 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
2fc40 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
2fc50 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
2fc60 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
2fc70 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
2fc80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2fc90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2fca0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2fcb0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2fcc0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2fcd0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2fce0 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
2fcf0 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
2fd00 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
2fd10 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
2fd20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2fd30 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
2fd40 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
2fd50 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2fd60 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2fd70 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
2fd80 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
2fd90 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
2fda0 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
2fdb0 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
2fdc0 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
2fdd0 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
2fde0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
2fdf0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
2fe00 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
2fe10 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
2fe20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
2fe30 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
2fe40 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
2fe50 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
2fe60 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
2fe70 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
2fe80 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
2fe90 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
2fea0 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
2feb0 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
2fec0 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
2fed0 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
2fee0 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
2fef0 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
2ff00 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2ff10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2ff20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2ff30 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
2ff40 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
2ff50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2ff60 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
2ff70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ff80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2ff90 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2ffa0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
2ffb0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2ffc0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
2ffd0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
2ffe0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
2fff0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
30000 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
30010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30020 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
30030 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
30040 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
30050 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
30060 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
30070 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
30080 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
30090 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
300a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
300b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
300c0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
300d0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
300e0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
300f0 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
30100 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
30110 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
30120 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
30130 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
30140 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
30150 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
30160 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
30170 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
30180 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20   -1, &sSort,.   
30190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301a0 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70     &sDistinct, p
301b0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
301c0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
301d0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
301e0 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
301f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30200 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
30210 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
30220 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
30230 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
30240 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
30250 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
30260 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
30270 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
30280 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
30290 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
302a0 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
302b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
302c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
302d0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
302e0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
302f0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
30300 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30310 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30320 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
30330 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
30340 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
30350 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
30360 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
30370 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
30380 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
30390 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
303a0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
303b0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
303c0 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
303d0 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
303e0 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
303f0 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
30400 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
30410 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
30420 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
30430 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
30440 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
30450 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
30460 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
30470 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
30480 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
30490 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
304a0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
304b0 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
304c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
304d0 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
304e0 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
304f0 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
30500 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
30510 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
30520 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
30530 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
30540 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
30550 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
30560 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
30570 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
30580 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
30590 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
305a0 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
305b0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
305c0 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
305d0 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
305e0 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
305f0 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
30600 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
30610 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
30620 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
30630 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
30640 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
30650 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
30660 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
30670 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
30680 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
30690 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
306a0 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
306b0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
306c0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
306d0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
306e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
306f0 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
30700 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
30710 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
30720 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
30730 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
30740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30750 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
30760 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
30770 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
30780 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
30790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
307a0 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
307b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
307c0 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
307d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
307e0 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
307f0 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
30800 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
30810 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
30820 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
30830 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
30840 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
30850 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
30860 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
30870 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
30880 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30890 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
308a0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
308b0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
308c0 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
308d0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
308e0 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
308f0 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20  the lowest scan 
30900 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  cost..        **
30910 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
30920 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20  1-04-15) Do not 
30930 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f  do a full scan o
30940 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69  f an unordered i
30950 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
30960 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
30970 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20  3-10-03) Do not 
30980 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65  count the entrie
30990 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69  s in a partial i
309a0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
309b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70  .        ** In p
309c0 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49  ractice the KeyI
309d0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69  nfo structure wi
309e0 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
309f0 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20  It is only .    
30a00 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f      ** passed to
30a10 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61   keep OP_OpenRea
30a20 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20  d happy..       
30a30 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
30a40 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
30a50 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65  ) pBest = sqlite
30a60 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
30a70 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
30a80 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
30a90 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
30aa0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
30ab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
30ac0 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  dx->bUnordered==
30ad0 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
30ae0 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
30af0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20  Tab->szTabRow.  
30b00 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
30b10 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
30b20 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
30b30 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78   (!pBest || pIdx
30b40 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74  ->szIdxRow<pBest
30b50 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20  ->szIdxRow).    
30b60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30b70 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
30b80 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
30b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30ba0 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
30bb0 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
30bc0 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
30bd0 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
30be0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
30bf0 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
30c00 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pBest);.        
30c10 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
30c20 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
30c30 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74  ursor, execute t
30c40 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f  he OP_Count, clo
30c50 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a  se the cursor. *
30c60 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
30c70 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
30c80 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
30c90 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c  Csr, iRoot, iDb,
30ca0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
30cb0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
30cc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30cd0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
30ce0 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
30cf0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
30d00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30d20 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
30d30 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
30d40 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
30d50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30d60 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30d70 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
30d80 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69         explainSi
30d90 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65  mpleCount(pParse
30da0 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a  , pTab, pBest);.
30db0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
30dc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
30dd0 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
30de0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
30df0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
30e00 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
30e10 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
30e20 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
30e30 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
30e40 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
30e50 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
30e60 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
30e70 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
30e80 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30e90 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
30ea0 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
30eb0 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
30ec0 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
30ed0 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
30ee0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
30ef0 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
30f00 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
30f10 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
30f20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
30f30 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
30f40 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
30f50 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
30f60 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
30f70 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
30f80 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
30f90 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
30fa0 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
30fb0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
30fc0 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
30fd0 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
30fe0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
30ff0 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
31000 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
31010 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
31020 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
31030 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
31040 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
31050 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
31060 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
31070 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31080 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
31090 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
310a0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
310b0 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
310c0 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
310d0 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20  modify behavior 
310e0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
310f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31100 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
31110 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
31120 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
31130 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
31140 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
31150 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
31160 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
31170 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
31180 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
31190 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
311a0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
311b0 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
311c0 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
311d0 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
311e0 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
311f0 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
31200 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
31210 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
31220 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
31230 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
31240 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
31250 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
31260 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
31270 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
31280 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
31290 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
312a0 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
312b0 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
312c0 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
312d0 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
312e0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
312f0 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
31300 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
31310 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
31320 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a  ORMAL;.        .
31330 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31340 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
31350 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
31360 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  ( flag==0 );.   
31370 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
31380 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ing==0 ){.      
31390 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61      flag = minMa
313a0 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f  xQuery(&sAggInfo
313b0 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20  , &pMinMax);.   
313c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
313d0 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c  ssert( flag==0 |
313e0 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26  | (pMinMax!=0 &&
313f0 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
31400 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  =1) );..        
31410 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
31420 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
31430 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
31440 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20  up(db, pMinMax, 
31450 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
31460 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
31470 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e          if( pMin
31480 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Max && !db->mall
31490 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
314a0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
314b0 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
314c0 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52  = flag!=WHERE_OR
314d0 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a  DERBY_MIN ?1:0;.
314e0 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
314f0 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
31500 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
31510 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31520 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
31530 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
31540 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
31550 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
31560 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
31570 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
31580 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
31590 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
315a0 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
315b0 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
315c0 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
315d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
315e0 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
315f0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
31600 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Info);.        p
31610 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
31620 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
31630 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
31640 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c  re, pMinMax,0,fl
31650 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ag,0);.        i
31660 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
31670 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31680 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
31690 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
316a0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
316b0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
316c0 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
316d0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
316e0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
316f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
31700 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e  inMax==0 || pMin
31710 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  Max->nExpr==1 );
31720 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
31730 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
31740 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a  ed(pWInfo)>0 ){.
31750 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31760 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c  3VdbeGoto(v, sql
31770 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
31780 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20  bel(pWInfo));.  
31790 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
317a0 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
317b0 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
317c0 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
317d0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
317e0 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
317f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31800 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
31810 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
31820 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
31830 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
31840 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
31850 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f      }..      sSo
31860 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
31870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
31880 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
31890 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
318a0 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
318b0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
318c0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
318d0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
318e0 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20  st, -1, 0, 0, . 
318f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31900 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
31910 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
31920 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
31930 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
31940 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
31950 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
31960 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
31970 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
31980 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
31990 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
319a0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
319b0 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
319c0 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
319d0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
319e0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
319f0 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
31a00 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
31a10 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
31a20 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
31a30 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
31a40 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
31a50 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
31a60 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
31a70 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
31a80 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
31a90 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
31aa0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
31ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ac0 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
31ad0 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
31ae0 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
31af0 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
31b00 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
31b10 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
31b20 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
31b30 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
31b40 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
31b50 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
31b60 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
31b70 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
31b80 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
31b90 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
31ba0 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
31bb0 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
31bc0 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
31bd0 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
31be0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
31bf0 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
31c00 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
31c10 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
31c20 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
31c30 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
31c40 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
31c50 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
31c60 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
31c70 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
31c80 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
31c90 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
31ca0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
31cb0 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
31cc0 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
31cd0 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
31ce0 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
31cf0 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
31d00 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
31d10 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
31d20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
31d30 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
31d40 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
31d50 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
31d60 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
31d70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
31d80 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
31d90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
31da0 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
31db0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
31dc0 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
31dd0 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45  aFunc);.#if SELE
31de0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
31df0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
31e00 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70  pParse,p,("end p
31e10 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
31e20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
31e30 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
31e40 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
31e50 0a                                               .