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

Artifact dfb6cadc3dcfba1b1bdbfba62ebba2b4b673413e:


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 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  ee(db, p);.    p
0b50: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0b60: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0b70: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0b80: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0b90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ba0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
0bb0: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
0bc0: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
0bd0: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
0be0: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
0bf0: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
0c00: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
0c10: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
0c20: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
0c30: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
0c40: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
0c50: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
0c60: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0c70: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0c80: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0c90: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0ca0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0cb0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
0cc0: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
0cd0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0ce0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
0cf0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
0d00: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
0d10: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
0d20: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
0d30: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
0d40: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
0d50: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
0d60: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
0d70: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
0d80: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
0d90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
0da0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
0db0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
0dc0: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
0dd0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
0df0: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
0e00: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
0e10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0e20: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
0e30: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
0e40: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
0e50: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
0e60: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
0e70: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
0e80: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
0e90: 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  pLimit,         
0ea0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
0eb0: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
0ec0: 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  used */.  Expr *
0ed0: 70 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  pOffset         
0ee0: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
0ef0: 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20    NULL means no 
0f00: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
0f10: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
0f20: 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20  elect standin;. 
0f30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0f40: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
0f50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
0f60: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
0f70: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
0f80: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
0f90: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
0fa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
0fb0: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0fc0: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  in;.  }.  if( pE
0fd0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
0fe0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
0ff0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1000: 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  arse, 0, sqlite3
1010: 45 78 70 72 28 64 62 2c 54 4b 5f 41 53 54 45 52  Expr(db,TK_ASTER
1020: 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70  ISK,0));.  }.  p
1030: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  New->pEList = pE
1040: 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  List;.  pNew->op
1050: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
1060: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
1070: 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65   selFlags;.  pNe
1080: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
1090: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
10a0: 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   0;.#if SELECTTR
10b0: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e  ACE_ENABLED.  pN
10c0: 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20  ew->zSelName[0] 
10d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e  = 0;.#endif.  pN
10e0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
10f0: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
1100: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
1110: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1120: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
1130: 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20    if( pSrc==0 ) 
1140: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62  pSrc = sqlite3Db
1150: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1160: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1170: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
1180: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
1190: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
11a0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
11b0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
11c0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
11d0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
11e0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
11f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1200: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1210: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1220: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1230: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
1240: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70  t = pOffset;.  p
1250: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a  New->pWith = 0;.
1260: 20 20 61 73 73 65 72 74 28 20 70 4f 66 66 73 65    assert( pOffse
1270: 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d  t==0 || pLimit!=
1280: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
1290: 72 3e 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  r>0 || db->mallo
12a0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
12b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12c0: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65  iled ) {.    cle
12d0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
12e0: 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  w, pNew!=&standi
12f0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  n);.    pNew = 0
1300: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1310: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
1320: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
1330: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
1340: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
1350: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
1360: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20  rn pNew;.}..#if 
1370: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1380: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  LED./*.** Set th
1390: 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65  e name of a Sele
13a0: 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ct object.*/.voi
13b0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53  d sqlite3SelectS
13c0: 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70  etName(Select *p
13d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
13e0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ame){.  if( p &&
13f0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
1400: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1410: 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d  izeof(p->zSelNam
1420: 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), p->zSelName,
1430: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%s", zName);. 
1440: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1450: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
1460: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
1470: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
1480: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1490: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
14a0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
14b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
14c0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
14d0: 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64   ) clearSelect(d
14e0: 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  b, p, 1);.}../*.
14f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1500: 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
1510: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
1520: 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70  tement in a comp
1530: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
1540: 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68  Select *findRigh
1550: 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29  tmost(Select *p)
1560: 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e  {.  while( p->pN
1570: 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65  ext ) p = p->pNe
1580: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  xt;.  return p;.
1590: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31  }../*.** Given 1
15a0: 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72   to 3 identifier
15b0: 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65 20  s preceding the 
15c0: 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65  JOIN keyword, de
15d0: 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74  termine the.** t
15e0: 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65  ype of join.  Re
15f0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
1600: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78  constant that ex
1610: 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70  presses that typ
1620: 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66  e.** in terms of
1630: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
1640: 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a  it values:.**.**
1650: 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a       JT_INNER.**
1660: 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a       JT_CROSS.**
1670: 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a       JT_OUTER.**
1680: 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a       JT_NATURAL.
1690: 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a  **     JT_LEFT.*
16a0: 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a  *     JT_RIGHT.*
16b0: 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65  *.** A full oute
16c0: 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f  r join is the co
16d0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f  mbination of JT_
16e0: 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48  LEFT and JT_RIGH
16f0: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  T..**.** If an i
1700: 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70  llegal or unsupp
1710: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20  orted join type 
1720: 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74  is seen, then st
1730: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  ill return.** a 
1740: 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70  join type, but p
1750: 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  ut an error in t
1760: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
1770: 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
1780: 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73  te3JoinType(Pars
1790: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
17a0: 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c   *pA, Token *pB,
17b0: 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69   Token *pC){.  i
17c0: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  nt jointype = 0;
17d0: 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b  .  Token *apAll[
17e0: 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a  3];.  Token *p;.
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1810: 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33    0123456789 123
1820: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
1830: 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63   123 */.  static
1840: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
1850: 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61  Text[] = "natura
1860: 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c  leftouterightful
1870: 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20  linnercross";.  
1880: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1890: 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20  uct {.    u8 i; 
18a0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
18b0: 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74  ing of keyword t
18c0: 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b  ext in zKeyText[
18d0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61  ] */.    u8 nCha
18e0: 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20  r;    /* Length 
18f0: 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69  of the keyword i
1900: 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  n characters */.
1910: 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20      u8 code;    
1920: 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61   /* Join type ma
1930: 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f  sk */.  } aKeywo
1940: 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  rd[] = {.    /* 
1950: 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20  natural */ { 0, 
1960: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20   7, JT_NATURAL  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1980: 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20  .    /* left    
1990: 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c  */ { 6,  4, JT_L
19a0: 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20  EFT|JT_OUTER    
19b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
19c0: 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c  outer   */ { 10,
19d0: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20   5, JT_OUTER    
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
19f0: 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20  .    /* right   
1a00: 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52  */ { 14, 5, JT_R
1a10: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  IGHT|JT_OUTER   
1a20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1a30: 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c  full    */ { 19,
1a40: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
1a50: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
1a60: 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20  .    /* inner   
1a70: 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49  */ { 23, 5, JT_I
1a80: 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NNER            
1a90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1aa0: 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c  cross   */ { 28,
1ab0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
1ac0: 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c  CROSS         },
1ad0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
1ae0: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
1af0: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
1b00: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
1b10: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
1b20: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
1b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
1b40: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
1b50: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
1b60: 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b  e(aKeyword); j++
1b70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1b80: 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e  n==aKeyword[j].n
1b90: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
1ba0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
1bb0: 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20  mp((char*)p->z, 
1bc0: 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f  &zKeyText[aKeywo
1bd0: 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d  rd[j].i], p->n)=
1be0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
1bf0: 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f  intype |= aKeywo
1c00: 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  rd[j].code;.    
1c10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
1c30: 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a  tcase( j==0 || j
1c40: 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a  ==1 || j==2 || j
1c50: 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a  ==3 || j==4 || j
1c60: 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20  ==5 || j==6 );. 
1c70: 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53     if( j>=ArrayS
1c80: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b  ize(aKeyword) ){
1c90: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1ca0: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
1cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cc0: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
1cd0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
1ce0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
1cf0: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
1d00: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
1d10: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
1d20: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d  onst char *zSp =
1d40: 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74   " ";.    assert
1d50: 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pB!=0 );.    i
1d60: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b  f( pC==0 ){ zSp+
1d70: 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  +; }.    sqlite3
1d80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d90: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   "unknown or uns
1da0: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
1db0: 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54  pe: ".       "%T
1dc0: 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42   %T%s%T", pA, pB
1dd0: 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20  , zSp, pC);.    
1de0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1df0: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
1e00: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1e10: 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
1e20: 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65      && (jointype
1e30: 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   & (JT_LEFT|JT_R
1e40: 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20  IGHT))!=JT_LEFT 
1e50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1e60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1e70: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1e80: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1e90: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1ea0: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1eb0: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1ec0: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1ed0: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ef0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1f00: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
1f10: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1f20: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
1f30: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
1f40: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
1f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
1f60: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
1f70: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1f80: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1f90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1fa0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1fb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1fc0: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1fd0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1fe0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1ff0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
2000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
2010: 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74 61  h the first N ta
2020: 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72  bles in pSrc, fr
2030: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
2040: 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a  , looking for a.
2050: 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68 61  ** table that ha
2060: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  s a column named
2070: 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57   zCol.  .**.** W
2080: 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a  hen found, set *
2090: 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c  piTab and *piCol
20a0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e   to the table in
20b0: 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  dex and column i
20c0: 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  ndex.** of the m
20d0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61  atching column a
20e0: 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a  nd return TRUE..
20f0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75  **.** If not fou
2100: 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  nd, return FALSE
2110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2120: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
2130: 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  dex(.  SrcList *
2140: 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41  pSrc,       /* A
2150: 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74  rray of tables t
2160: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
2170: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
2180: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2190: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e  tables in pSrc->
21a0: 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  a[] to search */
21b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21c0: 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Col,    /* Name 
21d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65  of the column we
21e0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
21f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62   */.  int *piTab
2200: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ,          /* Wr
2210: 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72  ite index of pSr
2220: 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20  c->a[] here */. 
2230: 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20   int *piCol     
2240: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69        /* Write i
2250: 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b  ndex of pSrc->a[
2260: 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43  *piTab].pTab->aC
2270: 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ol[] here */.){.
2280: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2290: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
22a0: 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
22b0: 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  s in pSrc */.  i
22c0: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
22d0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
22e0: 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20  column matching 
22f0: 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  zCol */..  asser
2300: 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28  t( (piTab==0)==(
2310: 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a  piCol==0) );  /*
2320: 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72   Both or neither
2330: 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66   are NULL */.  f
2340: 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b  or(i=0; i<N; i++
2350: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f  ){.    iCol = co
2360: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e  lumnIndex(pSrc->
2370: 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29  a[i].pTab, zCol)
2380: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
2390: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
23a0: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  iTab ){.        
23b0: 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20  *piTab = i;.    
23c0: 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f      *piCol = iCo
23d0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
23e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
23f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2410: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2420: 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70  to add terms imp
2430: 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e  lied by JOIN syn
2440: 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  tax to the.** WH
2450: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
2460: 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43  ssion of a SELEC
2470: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65  T statement. The
2480: 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68   new term, which
2490: 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74  .** is ANDed wit
24a0: 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 57  h the existing W
24b0: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20  HERE clause, is 
24c0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
24d0: 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31  **    (tab1.col1
24e0: 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a   = tab2.col2).**
24f0: 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20 69  .** where tab1 i
2500: 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74 61  s the iSrc'th ta
2510: 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70  ble in SrcList p
2520: 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73 20  Src and tab2 is 
2530: 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29  the .** (iSrc+1)
2540: 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31  'th. Column col1
2550: 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c   is column iColL
2560: 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64  eft of tab1, and
2570: 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75   col2 is.** colu
2580: 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20  mn iColRight of 
2590: 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tab2..*/.static 
25a0: 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72  void addWhereTer
25b0: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
25c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
25d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
25e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
25f0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2610: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
2620: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
2630: 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20  .  int iLeft,   
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
2660: 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f  irst table to jo
2670: 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  in in pSrc */.  
2680: 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20  int iColLeft,   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
26b0: 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c  mn in first tabl
26c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  e */.  int iRigh
26d0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
26e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26f0: 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  of second table 
2700: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2710: 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20   iColRight,     
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2730: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
2740: 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  in second table 
2750: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72  */.  int isOuter
2760: 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Join,           
2770: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2780: 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52  this is an OUTER
2790: 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20   join */.  Expr 
27a0: 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20 20  **ppWhere       
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
27c0: 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45 20  /OUT: The WHERE 
27d0: 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f  clause to add to
27e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
27f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2800: 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a  b;.  Expr *pE1;.
2810: 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45    Expr *pE2;.  E
2820: 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73  xpr *pEq;..  ass
2830: 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68  ert( iLeft<iRigh
2840: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2850: 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74  Src->nSrc>iRight
2860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2870: 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61  rc->a[iLeft].pTa
2880: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
2890: 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70  Src->a[iRight].p
28a0: 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20  Tab );..  pE1 = 
28b0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
28c0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
28d0: 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66  , iLeft, iColLef
28e0: 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69  t);.  pE2 = sqli
28f0: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
2900: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52  xpr(db, pSrc, iR
2910: 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29  ight, iColRight)
2920: 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74  ;..  pEq = sqlit
2930: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2940: 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29  TK_EQ, pE1, pE2)
2950: 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20 69  ;.  if( pEq && i
2960: 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20  sOuterJoin ){.  
2970: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2980: 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f  y(pEq, EP_FromJo
2990: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
29a0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29b0: 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f  y(pEq, EP_TokenO
29c0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
29d0: 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56  );.    ExprSetVV
29e0: 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  AProperty(pEq, E
29f0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2a00: 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e   pEq->iRightJoin
2a10: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32  Table = (i16)pE2
2a20: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  ->iTable;.  }.  
2a30: 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  *ppWhere = sqlit
2a40: 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70  e3ExprAnd(db, *p
2a50: 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a  pWhere, pEq);.}.
2a60: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
2a70: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
2a80: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
2a90: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
2aa0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64  pression..** And
2ab0: 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52   set the Expr.iR
2ac0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f  ightJoinTable to
2ad0: 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72   iTable for ever
2ae0: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  y term in the.**
2af0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
2b00: 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ** The EP_FromJo
2b10: 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  in property is u
2b20: 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20  sed on terms of 
2b30: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
2b40: 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46   tell.** the LEF
2b50: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f  T OUTER JOIN pro
2b60: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68  cessing logic th
2b70: 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  at this term is 
2b80: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a  part of the.** j
2b90: 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20  oin restriction 
2ba0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2bb0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2bc0: 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61  use and not a pa
2bd0: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72  rt.** of the mor
2be0: 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20  e general WHERE 
2bf0: 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74  clause.  These t
2c00: 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f  erms are moved o
2c10: 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  ver to the.** WH
2c20: 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e  ERE clause durin
2c30: 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e  g join processin
2c40: 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f  g but we need to
2c50: 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74   remember that t
2c60: 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65  hey.** originate
2c70: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2c80: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
2c90: 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67  ** The Expr.iRig
2ca0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c  htJoinTable tell
2cb0: 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
2cc0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  se processing th
2cd0: 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  at the.** expres
2ce0: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
2cf0: 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e  table iRightJoin
2d00: 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68  Table even if th
2d10: 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  at table is not.
2d20: 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65  ** explicitly me
2d30: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65  ntioned in the e
2d40: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74  xpression.  That
2d50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2d60: 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61  needed.** for ca
2d70: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ses like this:.*
2d80: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
2d90: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
2da0: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
2db0: 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a  .b AND t1.x=5.**
2dc0: 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c  .** The where cl
2dd0: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65  ause needs to de
2de0: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
2df0: 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a   of the t1.x=5.*
2e00: 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74  * term until aft
2e10: 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f  er the t2 loop o
2e20: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20  f the join.  In 
2e30: 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e  that way, a.** N
2e40: 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20  ULL t2 row will 
2e50: 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  be inserted when
2e60: 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49  ever t1.x!=5.  I
2e70: 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64  f we do not.** d
2e80: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2e90: 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20  g of t1.x=5, it 
2ea0: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
2eb0: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  d immediately.**
2ec0: 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f   after the t1 lo
2ed0: 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68  op and rows with
2ee0: 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65   t1.x!=5 will ne
2ef0: 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ver appear in.**
2f00: 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69   the output, whi
2f10: 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e  ch is incorrect.
2f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f30: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
2f40: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2f50: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
2f60: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2f70: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
2f80: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
2f90: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2fa0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
2fb0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2fc0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2fd0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
2fe0: 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e  Reduce);.    p->
2ff0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
3000: 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20  = (i16)iTable;. 
3010: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
3020: 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e  _FUNCTION && p->
3030: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
3040: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
3050: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c  r(i=0; i<p->x.pL
3060: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
3070: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69  {.        setJoi
3080: 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74  nExpr(p->x.pList
3090: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
30a0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  able);.      }. 
30b0: 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e     }.    setJoin
30c0: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69  Expr(p->pLeft, i
30d0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20  Table);.    p = 
30e0: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
30f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3100: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
3110: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
3120: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
3130: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
3140: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
3150: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
3160: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
3170: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
3180: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
3190: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
31a0: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
31b0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
31c0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20  **.** The terms 
31d0: 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
31e0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
31f0: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
3200: 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  c structure..** 
3210: 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61  The left most ta
3220: 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74  ble is the first
3230: 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74   entry in Select
3240: 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68  .pSrc.  The righ
3250: 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20  t-most.** table 
3260: 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
3270: 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65  y.  The join ope
3280: 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e  rator is held in
3290: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a   the entry to.**
32a0: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73   the left.  Thus
32b0: 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e   entry 0 contain
32c0: 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
32d0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  tor for the join
32e0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72   between.** entr
32f0: 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e  ies 0 and 1.  An
3300: 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  y ON or USING cl
3310: 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64  auses associated
3320: 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61   with the join a
3330: 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63  re.** also attac
3340: 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
3350: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
3360: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
3370: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3380: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
3390: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
33a0: 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  t sqliteProcessJ
33b0: 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  oin(Parse *pPars
33c0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
33d0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69   /* All tables i
3400: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
3410: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
3440: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72  ounters */.  str
3450: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
3460: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *pLeft;     /* 
3470: 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67  Left table being
3480: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72   joined */.  str
3490: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
34a0: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20   *pRight;    /* 
34b0: 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e  Right table bein
34c0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70  g joined */..  p
34d0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
34e0: 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e   pLeft = &pSrc->
34f0: 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d  a[0];.  pRight =
3500: 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f   &pLeft[1];.  fo
3510: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
3520: 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67  Src-1; i++, pRig
3530: 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a  ht++, pLeft++){.
3540: 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74      Table *pLeft
3550: 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61  Tab = pLeft->pTa
3560: 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  b;.    Table *pR
3570: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
3580: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20  ->pTab;.    int 
3590: 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66  isOuter;..    if
35a0: 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62  ( NEVER(pLeftTab
35b0: 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62  ==0 || pRightTab
35c0: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
35d0: 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28  .    isOuter = (
35e0: 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74  pRight->fg.joint
35f0: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
3600: 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
3610: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
3620: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
3630: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
3640: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
3650: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
3660: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
3670: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
3680: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
3690: 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  f( pRight->fg.jo
36a0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
36b0: 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RAL ){.      if(
36c0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20   pRight->pOn || 
36d0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
36e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3700: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
3710: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
3720: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
3730: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3740: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
3750: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3760: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
3770: 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e  ; j<pRightTab->n
3780: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
3790: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20     char *zName; 
37a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
37b0: 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74  umn in the right
37c0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
37d0: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
37e0: 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66   /* Matching lef
37f0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
3800: 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b     int iLeftCol;
3810: 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f    /* Matching co
3820: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74  lumn in the left
3830: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20   table */..     
3840: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68     zName = pRigh
3850: 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  tTab->aCol[j].zN
3860: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
3870: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
3880: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
3890: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
38a0: 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20  iLeftCol) ){.   
38b0: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
38c0: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
38d0: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
38e0: 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20  l, i+1, j,.     
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
3910: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
3920: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3930: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
3940: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
3950: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
3960: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
3970: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3980: 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74  t->pOn && pRight
3990: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
39a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
39b0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
39c0: 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61  t have both ON a
39d0: 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20  nd USING ".     
39e0: 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74     "clauses in t
39f0: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a  he same join");.
3a00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3a10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
3a20: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
3a30: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
3a40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
3a50: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
3a60: 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   ** an AND opera
3a70: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
3a80: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
3a90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  ){.      if( isO
3aa0: 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78  uter ) setJoinEx
3ab0: 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20  pr(pRight->pOn, 
3ac0: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29  pRight->iCursor)
3ad0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
3ae0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
3af0: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
3b00: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
3b10: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
3b20: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
3b30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
3b40: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
3b50: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
3b60: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
3b70: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
3b80: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
3b90: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
3ba0: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
3bb0: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
3bc0: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
3bd0: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
3be0: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
3bf0: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
3c00: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
3c10: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
3c20: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
3c30: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
3c40: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
3c50: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
3c60: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
3c70: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
3c80: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
3c90: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
3ca0: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
3cb0: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
3cc0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3cd0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3ce0: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
3cf0: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
3d00: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
3d10: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
3d20: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
3d30: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
3d40: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3d50: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53  e term in the US
3d60: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
3d70: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b        int iLeft;
3d80: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
3d90: 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74 68  on the left with
3da0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3db0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
3dc0: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3dd0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
3de0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
3df0: 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66  olumn on the lef
3e00: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  t */.        int
3e10: 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a   iRightCol;   /*
3e20: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3e30: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
3e40: 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  n on the right *
3e50: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
3e60: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a   = pList->a[j].z
3e70: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52  Name;.        iR
3e80: 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e  ightCol = column
3e90: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
3ea0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3eb0: 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30   if( iRightCol<0
3ec0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61  .         || !ta
3ed0: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3ee0: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3ef0: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
3f00: 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29  ftCol).        )
3f10: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
3f20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3f30: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e  se, "cannot join
3f40: 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73   using column %s
3f50: 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20   - column ".    
3f60: 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65          "not pre
3f70: 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62  sent in both tab
3f80: 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  les", zName);.  
3f90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3fa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3fb0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3fc0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
3fd0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
3fe0: 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a  i+1, iRightCol,.
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
4010: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
4020: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
4030: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46  eturn 0;.}../* F
4040: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
4050: 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e   */.static KeyIn
4060: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
4070: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
4080: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4090: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
40a0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
40b0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
40c0: 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f  Form the KeyInfo
40d0: 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69   object from thi
40e0: 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20  s ExprList */.  
40f0: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
4100: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69       /* Begin wi
4110: 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f  th this column o
4120: 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  f pList */.  int
4130: 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
4140: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
4150: 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  ny extra columns
4160: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29   to the end */.)
4170: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ;../*.** Generat
4180: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
4190: 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64   push the record
41a0: 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 72 65   in registers re
41b0: 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68  gData.** through
41c0: 20 72 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31   regData+nData-1
41d0: 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   onto the sorter
41e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
41f0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4200: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4210: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
4220: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4230: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
4240: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4250: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
4260: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
4270: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
4280: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  elect,       /* 
4290: 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54  The whole SELECT
42a0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
42b0: 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20 20 20  int regData,    
42c0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
42d0: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
42e0: 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74   data to be sort
42f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
4300: 72 69 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f  rigData,       /
4310: 2a 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72  * First register
4320: 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65   holding data be
4330: 66 6f 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a  fore packing */.
4340: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
4350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4360: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
4370: 6e 20 74 68 65 20 64 61 74 61 20 61 72 72 61 79  n the data array
4380: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
4390: 78 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  xReg         /* 
43a0: 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72  No. of reg prior
43b0: 20 74 6f 20 72 65 67 44 61 74 61 20 61 76 61 69   to regData avai
43c0: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f  lable for use */
43d0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
43e0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75         /* Stmt u
4410: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
4420: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20  n */.  int bSeq 
4430: 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  = ((pSort->sortF
4440: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
4450: 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a  UseSorter)==0);.
4460: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53    int nExpr = pS
4470: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ort->pOrderBy->n
4480: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
4490: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44     /* No. of ORD
44a0: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
44b0: 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78   int nBase = nEx
44c0: 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74  pr + bSeq + nDat
44d0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
44e0: 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73    /* Fields in s
44f0: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a  orter record */.
4500: 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73     /* Regs for s
4540: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a  orter record */.
4550: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20    int regRecord 
4560: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
4570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4580: 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20     /* Assembled 
4590: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
45a0: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
45b0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20  pSort->nOBSat;  
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20      /* ORDER BY 
45e0: 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f  terms to skip */
45f0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
4620: 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72 65  to add sorter re
4630: 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a  cord to sorter *
4640: 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20  /.  int iLimit; 
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 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
4670: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
4680: 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c  sert( bSeq==0 ||
4690: 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73   bSeq==1 );.  as
46a0: 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c  sert( nData==1 |
46b0: 7c 20 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72  | regData==regOr
46c0: 69 67 44 61 74 61 20 7c 7c 20 72 65 67 4f 72 69  igData || regOri
46d0: 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66  gData==0 );.  if
46e0: 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a  ( nPrefixReg ){.
46f0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65      assert( nPre
4700: 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53  fixReg==nExpr+bS
4710: 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73  eq );.    regBas
4720: 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45  e = regData - nE
4730: 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65  xpr - bSeq;.  }e
4740: 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65  lse{.    regBase
4750: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
4760: 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  + 1;.    pParse-
4770: 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a  >nMem += nBase;.
4780: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53    }.  assert( pS
4790: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d  elect->iOffset==
47a0: 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c  0 || pSelect->iL
47b0: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69  imit!=0 );.  iLi
47c0: 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69  mit = pSelect->i
47d0: 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74  Offset ? pSelect
47e0: 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53  ->iOffset+1 : pS
47f0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
4800: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
4810: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
4820: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73  akeLabel(v);.  s
4830: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
4840: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
4850: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Sort->pOrderBy, 
4860: 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67  regBase, regOrig
4870: 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20  Data,.          
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
48a0: 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61 3f 20  | (regOrigData? 
48b0: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
48c0: 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62 53 65  : 0));.  if( bSe
48d0: 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  q ){.    sqlite3
48e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
48f0: 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74  _Sequence, pSort
4900: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42  ->iECursor, regB
4910: 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  ase+nExpr);.  }.
4920: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
4930: 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30 20 29  ==0 && nData>0 )
4940: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4950: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
4960: 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42 61  , regData, regBa
4970: 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e  se+nExpr+bSeq, n
4980: 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Data);.  }.  sql
4990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
49a0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
49b0: 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c   regBase+nOBSat,
49c0: 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72   nBase-nOBSat, r
49d0: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
49e0: 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20   nOBSat>0 ){.   
49f0: 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b   int regPrevKey;
4a00: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
4a10: 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f  nOBSat columns o
4a20: 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  f the previous r
4a30: 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ow */.    int ad
4a40: 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41  drFirst;    /* A
4a50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
4a60: 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f  _IfNot opcode */
4a70: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70  .    int addrJmp
4a80: 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
4a90: 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70  s of the OP_Jump
4aa0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56   opcode */.    V
4ab0: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
4ac0: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20   /* Opcode that 
4ad0: 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72  opens the sorter
4ae0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79   */.    int nKey
4af0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
4b00: 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b  ber of sorting k
4b10: 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c  ey columns, incl
4b20: 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63  uding OP_Sequenc
4b30: 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  e */.    KeyInfo
4b40: 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72   *pKI;     /* Or
4b50: 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f  iginal KeyInfo o
4b60: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61 62  n the sorter tab
4b70: 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72  le */..    regPr
4b80: 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e  evKey = pParse->
4b90: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
4ba0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72  se->nMem += pSor
4bb0: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e  t->nOBSat;.    n
4bc0: 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53  Key = nExpr - pS
4bd0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53  ort->nOBSat + bS
4be0: 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71  eq;.    if( bSeq
4bf0: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69   ){.      addrFi
4c00: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
4c10: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4c20: 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  Not, regBase+nEx
4c30: 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b  pr); .    }else{
4c40: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4c60: 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp1(v, OP_Seque
4c70: 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e  nceTest, pSort->
4c80: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d  iECursor);.    }
4c90: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
4ca0: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
4cb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4cc0: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72  P_Compare, regPr
4cd0: 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20  evKey, regBase, 
4ce0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a  pSort->nOBSat);.
4cf0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
4d00: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53  3VdbeGetOp(v, pS
4d10: 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64  ort->addrSortInd
4d20: 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ex);.    if( pPa
4d30: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
4d40: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
4d50: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b      pOp->p2 = nK
4d60: 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20  ey + nData;.    
4d70: 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  pKI = pOp->p4.pK
4d80: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73  eyInfo;.    mems
4d90: 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64  et(pKI->aSortOrd
4da0: 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65  er, 0, pKI->nFie
4db0: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
4dc0: 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74  _Jump below test
4dd0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  able */.    sqli
4de0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4df0: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b  v, -1, (char*)pK
4e00: 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  I, P4_KEYINFO);.
4e10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
4e20: 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a  I->nXField>2 );.
4e30: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79      pOp->p4.pKey
4e40: 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
4e50: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
4e60: 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  e, pSort->pOrder
4e70: 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20  By, nOBSat,.    
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69         pKI->nXFi
4eb0: 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  eld-1);.    addr
4ec0: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
4ed0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
4ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4ef0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
4f00: 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c  p, addrJmp+1, 0,
4f10: 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62   addrJmp+1); Vdb
4f20: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4f30: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b    pSort->labelBk
4f40: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Out = sqlite3Vdb
4f50: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
4f60: 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74     pSort->regRet
4f70: 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
4f80: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
4f90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4fa0: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
4fb0: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
4fc0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
4fd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4fe0: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
4ff0: 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69  Sorter, pSort->i
5000: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  ECursor);.    if
5010: 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ( iLimit ){.    
5020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5030: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
5040: 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e   iLimit, pSort->
5050: 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20  labelDone);.    
5060: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5070: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5080: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
5090: 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a  (v, addrFirst);.
50a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
50b0: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
50c0: 72 65 67 42 61 73 65 2c 20 72 65 67 50 72 65 76  regBase, regPrev
50d0: 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  Key, pSort->nOBS
50e0: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
50f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5100: 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20  addrJmp);.  }.  
5110: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
5120: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
5130: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
5140: 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49   op = OP_SorterI
5150: 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nsert;.  }else{.
5160: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49      op = OP_IdxI
5170: 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  nsert;.  }.  sql
5180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5190: 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e  t(v, op, pSort->
51a0: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
51b0: 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ord,.           
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 42              regB
51d0: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73  ase+nOBSat, nBas
51e0: 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28  e-nOBSat);.  if(
51f0: 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69   iLimit ){.    i
5200: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74  nt addr;.    int
5210: 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20   r1 = 0;.    /* 
5220: 46 69 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20  Fill the sorter 
5230: 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
5240: 73 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65  s LIMIT+OFFSET e
5250: 6e 74 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c  ntries.  (The iL
5260: 69 6d 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69  imit.    ** regi
5270: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
5280: 7a 65 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f  zed with value o
5290: 66 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29  f LIMIT+OFFSET.)
52a0: 20 20 41 66 74 65 72 20 74 68 65 20 73 6f 72 74    After the sort
52b0: 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20  er.    ** fills 
52c0: 75 70 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  up, delete the l
52d0: 65 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  east entry in th
52e0: 65 20 73 6f 72 74 65 72 20 61 66 74 65 72 20 65  e sorter after e
52f0: 61 63 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20  ach insert..    
5300: 2a 2a 20 54 68 75 73 20 77 65 20 6e 65 76 65 72  ** Thus we never
5310: 20 68 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20   hold more than 
5320: 74 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  the LIMIT+OFFSET
5330: 20 72 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20   rows in memory 
5340: 61 74 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61  at once */.    a
5350: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
5360: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
5370: 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29  NotZero, iLimit)
5380: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5390: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
53a0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c  beAddOp1(v, OP_L
53b0: 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ast, pSort->iECu
53c0: 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70  rsor);.    if( p
53d0: 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Sort->bOrderedIn
53e0: 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20  nerLoop ){.     
53f0: 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r1 = ++pParse->
5400: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
5410: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5420: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72   OP_Column, pSor
5430: 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78  t->iECursor, nEx
5440: 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  pr, r1);.      V
5450: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5460: 73 65 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20  seq"));.    }.  
5470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5480: 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
5490: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
54a0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72  r);.    if( pSor
54b0: 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  t->bOrderedInner
54c0: 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Loop ){.      /*
54d0: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
54e0: 6f 70 20 69 73 20 64 72 69 76 65 6e 20 62 79 20  op is driven by 
54f0: 61 6e 20 69 6e 64 65 78 20 73 75 63 68 20 74 68  an index such th
5500: 61 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20  at values from. 
5510: 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
5520: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
5530: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65  e inner loop are
5540: 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
5550: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
5560: 69 6d 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70  immediately jump
5570: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
5580: 72 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e  ration of an inn
5590: 65 72 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20  er loop if the. 
55a0: 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72       ** entry fr
55b0: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  om the current i
55c0: 74 65 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  teration does no
55d0: 74 20 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74  t fit into the t
55e0: 6f 70 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49  op.      ** LIMI
55f0: 54 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  T+OFFSET entries
5600: 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20   of the sorter. 
5610: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72  */.      int iBr
5620: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  k = sqlite3VdbeC
5630: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
5640: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
5650: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5660: 5f 45 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  _Eq, regBase+nEx
5670: 70 72 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20  pr, iBrk, r1);. 
5680: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5690: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
56a0: 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
56b0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
56c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
56d0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
56e0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d  (v, addr);.  }.}
56f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
5700: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
5710: 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74  e OFFSET.*/.stat
5720: 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73  ic void codeOffs
5730: 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  et(.  Vdbe *v,  
5740: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
5750: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
5760: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69  is VM */.  int i
5770: 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20  Offset,      /* 
5780: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
5790: 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e   the offset coun
57a0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ter */.  int iCo
57b0: 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75  ntinue     /* Ju
57c0: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
57d0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
57e0: 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  rd */.){.  if( i
57f0: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
5800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5810: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  3(v, OP_IfPos, i
5820: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
5830: 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72  e, 1); VdbeCover
5840: 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
5850: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
5860: 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  SET"));.  }.}../
5870: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
5880: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
5890: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e   make sure the N
58a0: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
58b0: 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66  ing at iMem.** f
58c0: 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65  orm a distinct e
58d0: 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61  ntry.  iTab is a
58e0: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
58f0: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
5900: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
5910: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
5920: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
5930: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
5940: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
5950: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
5960: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
5970: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
5980: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
5990: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
59a0: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
59b0: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
59c0: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
59d0: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
59e0: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
59f0: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
5a00: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
5a10: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
5a20: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
5a30: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
5a40: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
5a50: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
5a60: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
5a70: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
5a80: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
5a90: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
5aa0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
5ab0: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
5ac0: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
5ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5ae0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a  er of elements *
5af0: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
5b00: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
5b10: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
5b20: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72  Vdbe *v;.  int r
5b30: 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  1;..  v = pParse
5b40: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20  ->pVdbe;.  r1 = 
5b50: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5b60: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
5b70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5b80: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
5b90: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
5ba0: 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43   iMem, N); VdbeC
5bb0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
5bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5bd0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5be0: 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a  , iMem, N, r1);.
5bf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5c00: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
5c10: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
5c20: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71  , iMem, N);.  sq
5c30: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5c40: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5c60: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
5c70: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
5c80: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
5c90: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
5ca0: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
5cb0: 20 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65   If srcTab is ne
5cc0: 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65  gative, then the
5cd0: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
5ce0: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
5cf0: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
5d00: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
5d10: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
5d20: 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72  srcTab is.** zer
5d30: 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20  o or more, then 
5d40: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
5d50: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
5d60: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
5d70: 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  ly .** to get th
5d80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
5d90: 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c  mns and the coll
5da0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
5db0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
5dc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
5dd0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
5de0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5e00: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
5e10: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e30: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
5e40: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
5e50: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
5e60: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
5e70: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
5e80: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
5e90: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
5ea0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
5eb0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
5ec0: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
5ed0: 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  le */.  SortCtx 
5ee0: 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20  *pSort,         
5ef0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
5f00: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
5f10: 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20  rocess ORDER BY 
5f20: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
5f30: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
5f40: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
5f50: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
5f60: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
5f70: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
5f80: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
5f90: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
5fa0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
5fb0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
5fc0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
5fd0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
5fe0: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
5ff0: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
6000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
6010: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
6020: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
6030: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
6040: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
6050: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
6060: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
6070: 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nct;            
6080: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
6090: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
60a0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
60b0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
60c0: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
60d0: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
60e0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
60f0: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
6100: 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72  >iSDParm; /* Fir
6110: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
6120: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
6130: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
6140: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
6150: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
6160: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
6170: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
6180: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
6190: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
61a0: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
61b0: 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20   regResult */.. 
61c0: 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67   /* Usually, reg
61d0: 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69  Result is the fi
61e0: 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61  rst cell in an a
61f0: 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63  rray of memory c
6200: 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ells.  ** contai
6210: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
6220: 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20   result row. In 
6230: 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69  this case regOri
6240: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  g is set to the.
6250: 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e    ** same value.
6260: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
6270: 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69   results are bei
6280: 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73  ng sent to the s
6290: 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20  orter, the.  ** 
62a0: 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65  values for any e
62b0: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
62c0: 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66  are also part of
62d0: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72   the sort-key ar
62e0: 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66  e omitted.  ** f
62f0: 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20  rom this array. 
6300: 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67  In this case reg
6310: 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a  Orig is set to z
6320: 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ero.  */.  int r
6330: 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  egResult;       
6340: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
6350: 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e  of memory holdin
6360: 67 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74  g current result
6370: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72  s */.  int regOr
6380: 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ig;             
6390: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
63a0: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75  emory holding fu
63b0: 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29  ll result (or 0)
63c0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76   */..  assert( v
63d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
63e0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73  List!=0 );.  has
63f0: 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74  Distinct = pDist
6400: 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74  inct ? pDistinct
6410: 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48  ->eTnctType : WH
6420: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
6430: 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26  P;.  if( pSort &
6440: 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  & pSort->pOrderB
6450: 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30  y==0 ) pSort = 0
6460: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30  ;.  if( pSort==0
6470: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
6480: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6490: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a  iContinue!=0 );.
64a0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
64b0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
64c0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20  ontinue);.  }.. 
64d0: 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71   /* Pull the req
64e0: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  uested columns..
64f0: 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f    */.  nResultCo
6500: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
6510: 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d  r;..  if( pDest-
6520: 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >iSdst==0 ){.   
6530: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
6540: 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d      nPrefixReg =
6550: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
6560: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
6570: 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74  f( !(pSort->sort
6580: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
6590: 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50  _UseSorter) ) nP
65a0: 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20  refixReg++;.    
65b0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
65c0: 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  = nPrefixReg;.  
65d0: 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69    }.    pDest->i
65e0: 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Sdst = pParse->n
65f0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
6600: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
6610: 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  ltCol;.  }else i
6620: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b  f( pDest->iSdst+
6630: 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61  nResultCol > pPa
6640: 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20  rse->nMem ){.   
6650: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65   /* This is an e
6660: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74  rror condition t
6670: 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20  hat can result, 
6680: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
6690: 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  n a SELECT.    *
66a0: 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  * on the right-h
66b0: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49  and side of an I
66c0: 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d  NSERT contains m
66d0: 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ore result colum
66e0: 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74  ns than.    ** t
66f0: 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73  here are columns
6700: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   in the table on
6710: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20   the left.  The 
6720: 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61  error will be ca
6730: 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ught.    ** and 
6740: 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20  reported later. 
6750: 20 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   But we need to 
6760: 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68  make sure enough
6770: 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63   memory is alloc
6780: 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61  ated.    ** to a
6790: 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69  void other spuri
67a0: 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68  ous errors in th
67b0: 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20  e meantime. */. 
67c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
67d0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
67e0: 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73   }.  pDest->nSds
67f0: 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  t = nResultCol;.
6800: 20 20 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52    regOrig = regR
6810: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
6820: 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54  Sdst;.  if( srcT
6830: 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ab>=0 ){.    for
6840: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
6850: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6860: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6870: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
6880: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
6890: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56  sult+i);.      V
68a0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
68b0: 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  %s", pEList->a[i
68c0: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
68d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
68e0: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
68f0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
6900: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
6910: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
6920: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
6930: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
6940: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
6950: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
6960: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
6970: 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c  */.    u8 ecelFl
6980: 61 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ags;.    if( eDe
6990: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
69a0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
69b0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
69c0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
69d0: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51    ecelFlags = SQ
69e0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20  LITE_ECEL_DUP;. 
69f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6a00: 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ecelFlags = 0;. 
6a10: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
6a20: 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c   eDest!=SRT_Tabl
6a30: 65 20 7c 7c 20 70 53 6f 72 74 3d 3d 30 20 29 3b  e || pSort==0 );
6a40: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26  .    if( pSort &
6a50: 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d 30  & hasDistinct==0
6a60: 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45   && eDest!=SRT_E
6a70: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 20  phemTab ){.     
6a80: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   /* For each exp
6a90: 72 65 73 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73  ression in pELis
6aa0: 74 20 74 68 61 74 20 69 73 20 61 20 63 6f 70 79  t that is a copy
6ab0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
6ac0: 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  n in.      ** th
6ad0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6ae0: 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  e (pSort->pOrder
6af0: 42 79 29 2c 20 73 65 74 20 74 68 65 20 61 73 73  By), set the ass
6b00: 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20 20 2a  ociated .      *
6b10: 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61  * iOrderByCol va
6b20: 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  lue to one more 
6b30: 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  than the index o
6b40: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 0a  f the ORDER BY .
6b50: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
6b60: 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ion within the s
6b70: 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70 75 73  ort-key that pus
6b80: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 77 69  hOntoSorter() wi
6b90: 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ll generate..   
6ba0: 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77     ** This allow
6bb0: 73 20 74 68 65 20 70 45 4c 69 73 74 20 66 69 65  s the pEList fie
6bc0: 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64  ld to be omitted
6bd0: 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64   from the sorted
6be0: 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a   record,.      *
6bf0: 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20 61  * saving space a
6c00: 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20  nd CPU cycles.  
6c10: 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  */.      ecelFla
6c20: 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43  gs |= (SQLITE_EC
6c30: 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54  EL_OMITREF|SQLIT
6c40: 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 20 20 20  E_ECEL_REF);.   
6c50: 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e     for(i=pSort->
6c60: 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d  nOBSat; i<pSort-
6c70: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
6c80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6c90: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69  int j;.        i
6ca0: 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70  f( (j = pSort->p
6cb0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
6cc0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30  x.iOrderByCol)>0
6cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
6ce0: 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78  List->a[j-1].u.x
6cf0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69  .iOrderByCol = i
6d00: 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  +1-pSort->nOBSat
6d10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6d20: 20 20 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69    }.      regOri
6d30: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  g = 0;.      ass
6d40: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
6d50: 53 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Set || eDest==SR
6d60: 54 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20  T_Mem .         
6d70: 20 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f    || eDest==SRT_
6d80: 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65  Coroutine || eDe
6d90: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
6da0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73  ;.    }.    nRes
6db0: 75 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ultCol = sqlite3
6dc0: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
6dd0: 28 70 50 61 72 73 65 2c 70 45 4c 69 73 74 2c 72  (pParse,pEList,r
6de0: 65 67 52 65 73 75 6c 74 2c 30 2c 65 63 65 6c 46  egResult,0,ecelF
6df0: 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
6e00: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
6e10: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
6e20: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
6e30: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
6e40: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
6e50: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
6e60: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
6e70: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
6e80: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
6e90: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
6ea0: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
6eb0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44  {.    switch( pD
6ec0: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
6ed0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
6ee0: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
6ef0: 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
6f00: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
6f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
6f20: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
6f30: 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
6f40: 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nstr. */.       
6f50: 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20   int iJump;     
6f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
6f70: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
6f80: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50          int regP
6f90: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
6fa0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20  /* Previous row 
6fb0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  content */..    
6fc0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
6fd0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72  space for the pr
6fe0: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
6ff0: 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20        regPrev = 
7000: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
7010: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
7020: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
7030: 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ol;..        /* 
7040: 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  Change the OP_Op
7050: 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65  enEphemeral code
7060: 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20  d earlier to an 
7070: 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20  OP_Null.        
7080: 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f  ** sets the MEM_
7090: 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74  Cleared bit on t
70a0: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
70b0: 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  r of the.       
70c0: 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c   ** previous val
70d0: 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  ue.  This will c
70e0: 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62  ause the OP_Ne b
70f0: 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20  elow to always. 
7100: 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f         ** fail o
7110: 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  n the first iter
7120: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
7130: 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  p even if the fi
7140: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  rst.        ** r
7150: 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e  ow is all NULLs.
7160: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
7170: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7180: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70  hangeToNoop(v, p
7190: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
71a0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
71b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
71c0: 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  tOp(v, pDistinct
71d0: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
71e0: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
71f0: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
7200: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b      pOp->p1 = 1;
7210: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
7220: 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20   = regPrev;..   
7230: 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c       iJump = sql
7240: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
7250: 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74  ddr(v) + nResult
7260: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Col;.        for
7270: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
7280: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
7290: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
72a0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
72b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
72c0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
72d0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
72e0: 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d  f( i<nResultCol-
72f0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
7300: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7310: 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67  p3(v, OP_Ne, reg
7320: 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c  Result+i, iJump,
7330: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
7340: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
7350: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7360: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7380: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
7390: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
73a0: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
73b0: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
73c0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
73d0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d  v);.           }
73e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
73f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
7400: 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  , -1, (const cha
7410: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
7420: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
7430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7440: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
7450: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20  NULLEQ);.       
7460: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
7470: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t( sqlite3VdbeCu
7480: 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a  rrentAddr(v)==iJ
7490: 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ump || pParse->d
74a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
74b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
74c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
74d0: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75  OP_Copy, regResu
74e0: 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65  lt, regPrev, nRe
74f0: 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  sultCol-1);.    
7500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7510: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
7520: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
7530: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
7540: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7550: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
7560: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
7570: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7580: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
7590: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
75a0: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
75b0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
75c0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
75d0: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
75e0: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
75f0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
7600: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
7610: 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43  ntinue, nResultC
7620: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
7630: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
7640: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  lt);.        bre
7650: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7660: 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d  }.    if( pSort=
7670: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
7680: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
7690: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
76a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
76b0: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
76c0: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
76d0: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
76e0: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
76f0: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
7700: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
7710: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
7720: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
7730: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
7740: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
7750: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
7760: 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
7770: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
7780: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7790: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
77a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
77b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
77c0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
77d0: 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  l, r1);.      sq
77e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
77f0: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
7800: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7810: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7820: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  tCol);.      sql
7830: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7840: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
7850: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7860: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
7870: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
7880: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
7890: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
78a0: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
78b0: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
78c0: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
78d0: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
78e0: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
78f0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
7900: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
7910: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
7920: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ept: {.      sql
7930: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7940: 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20  , OP_IdxDelete, 
7950: 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74  iParm, regResult
7960: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
7970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7980: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7990: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
79a0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20  _SELECT */..    
79b0: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
79c0: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
79d0: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
79e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
79f0: 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61  SRT_Fifo:.    ca
7a00: 73 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a  se SRT_DistFifo:
7a10: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
7a20: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
7a30: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
7a40: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
7a50: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
7a60: 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78  (pParse, nPrefix
7a70: 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65  Reg+1);.      te
7a80: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7a90: 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
7aa0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7ab0: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
7ac0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7ad0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69  e( eDest==SRT_Fi
7ae0: 66 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  fo );.      test
7af0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7b00: 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20  _DistFifo );.   
7b10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7b20: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
7b30: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
7b40: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31  , nResultCol, r1
7b50: 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69  +nPrefixReg);.#i
7b60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7b70: 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20  T_CTE.      if( 
7b80: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
7b90: 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ifo ){.        /
7ba0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
7bb0: 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f  tion is DistFifo
7bc0: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
7bd0: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
7be0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e          ** on an
7bf0: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
7c00: 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  . If the current
7c10: 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20   row is already 
7c20: 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20  present.        
7c30: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ** in the index,
7c40: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74   do not write it
7c50: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20   to the output. 
7c60: 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a  If not, add the.
7c70: 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
7c80: 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e  nt row to the in
7c90: 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20  dex and proceed 
7ca0: 77 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20  with writing it 
7cb0: 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
7cc0: 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61  * output table a
7cd0: 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20  s well.  */.    
7ce0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
7cf0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
7d00: 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20  tAddr(v) + 4;.  
7d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7d20: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7d30: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
7d40: 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20   addr, r1, 0);. 
7d50: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
7d60: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
7d70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7d80: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
7d90: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
7da0: 31 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73  1,regResult,nRes
7db0: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
7dc0: 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d   assert( pSort==
7dd0: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  0 );.      }.#en
7de0: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53  dif.      if( pS
7df0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7e00: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7e10: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7e20: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65  r1+nPrefixReg,re
7e30: 67 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69  gResult,1,nPrefi
7e40: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
7e50: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7e60: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
7e70: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7e80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7e90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7ea0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
7eb0: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
7ec0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7ed0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
7ee0: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
7ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f00: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
7f10: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
7f20: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
7f30: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
7f40: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
7f50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
7f60: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
7f70: 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69  arse, r1, nPrefi
7f80: 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62  xReg+1);.      b
7f90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
7fa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7fb0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
7fc0: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
7fd0: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
7fe0: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
7ff0: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
8000: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
8010: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
8020: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
8030: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
8040: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
8050: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
8060: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
8070: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
8080: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
8090: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  {.      if( pSor
80a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
80b0: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
80c0: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
80d0: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
80e0: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
80f0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
8100: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
8110: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
8120: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
8130: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
8140: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
8150: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
8160: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
8170: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
8180: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
8190: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
81a0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
81b0: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20  ntoSorter(.     
81c0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
81d0: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
81e0: 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65  lt, regOrig, nRe
81f0: 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78  sultCol, nPrefix
8200: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
8210: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
8220: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
8230: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8240: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
8250: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
8260: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d  Dest->zAffSdst)=
8270: 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20  =nResultCol );. 
8280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8290: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
82a0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
82b0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
82c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  , .            r
82d0: 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  1, pDest->zAffSd
82e0: 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  st, nResultCol);
82f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8300: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
8310: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
8320: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8330: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8340: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8350: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
8360: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
8370: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8380: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
8390: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
83a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
83b0: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
83c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
83d0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
83e0: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
83f0: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
8400: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
8410: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
8420: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
8430: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
8440: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8450: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
8460: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
8470: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
8480: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
8490: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
84a0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
84b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
84c0: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
84d0: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
84e0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
84f0: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
8500: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
8510: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
8520: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
8530: 63 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66  cell or array of
8540: 20 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20   .    ** memory 
8550: 63 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20  cells and break 
8560: 6f 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20  out of the scan 
8570: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
8580: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
8590: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
85a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
85b0: 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d  rt( nResultCol<=
85c0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a  pDest->nSdst );.
85d0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
85e0: 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20  Sorter(.        
85f0: 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72      pParse, pSor
8600: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
8610: 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c   regOrig, nResul
8620: 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67  tCol, nPrefixReg
8630: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8640: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8650: 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73  nResultCol==pDes
8660: 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20  t->nSdst );.    
8670: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52      assert( regR
8680: 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a  esult==iParm );.
8690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
86a0: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
86b0: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
86c0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
86d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
86e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
86f0: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
8700: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
8710: 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53  Y */..    case S
8720: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20  RT_Coroutine:   
8730: 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61      /* Send data
8740: 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   to a co-routine
8750: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
8760: 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20  _Output: {      
8770: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
8780: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20  results */.     
8790: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
87a0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
87b0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
87c0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
87d0: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66  tput );.      if
87e0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
87f0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
8800: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
8810: 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72   p, regResult, r
8820: 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43  egOrig, nResultC
8830: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
8840: 20 20 20 20 20 20 20 20 20 20 20 6e 50 72 65 66             nPref
8850: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
8860: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
8870: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
8880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8890: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
88a0: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
88b0: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  DParm);.      }e
88c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
88d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
88e0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
88f0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8900: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8910: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
8920: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
8930: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
8940: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
8950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
8960: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
8970: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
8980: 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  TE.    /* Write 
8990: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  the results into
89a0: 20 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75   a priority queu
89b0: 65 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20  e that is order 
89c0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20  according to.   
89d0: 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65   ** pDest->pOrde
89e0: 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70  rBy (in pSO).  p
89f0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69  Dest->iSDParm (i
8a00: 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20  n iParm) is the 
8a10: 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20  cursor for an.  
8a20: 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
8a30: 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c  pSO->nExpr+2 col
8a40: 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b  umns.  Build a k
8a50: 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72  ey using pSO for
8a60: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a   the first.    *
8a70: 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c  * pSO->nExpr col
8a80: 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20  umns, then make 
8a90: 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72  sure all keys ar
8aa0: 65 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69  e unique by addi
8ab0: 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61  ng a.    ** fina
8ac0: 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f  l OP_Sequence co
8ad0: 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20  lumn.  The last 
8ae0: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65  column is the re
8af0: 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a  cord as a blob..
8b00: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
8b10: 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20  SRT_DistQueue:. 
8b20: 20 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75     case SRT_Queu
8b30: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  e: {.      int n
8b40: 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  Key;.      int r
8b50: 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20  1, r2, r3;.     
8b60: 20 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20   int addrTest = 
8b70: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  0;.      ExprLis
8b80: 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53  t *pSO;.      pS
8b90: 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65  O = pDest->pOrde
8ba0: 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  rBy;.      asser
8bb0: 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20  t( pSO );.      
8bc0: 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70  nKey = pSO->nExp
8bd0: 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  r;.      r1 = sq
8be0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
8bf0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
8c00: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
8c10: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
8c20: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72  nKey+2);.      r
8c30: 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20  3 = r2+nKey+1;. 
8c40: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
8c50: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
8c60: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
8c70: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
8c80: 73 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65  s DistQueue, the
8c90: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
8ca0: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
8cb0: 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e     ** on a secon
8cc0: 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  d ephemeral inde
8cd0: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c  x that holds all
8ce0: 20 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72   values every pr
8cf0: 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20  eviously.       
8d00: 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65   ** added to the
8d10: 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20   queue. */.     
8d20: 20 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71     addrTest = sq
8d30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
8d40: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
8d50: 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20  iParm+1, 0, .   
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20       regResult, 
8d90: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8da0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
8db0: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
8dc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8dd0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8de0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
8df0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
8e00: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  3);.      if( eD
8e10: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
8e20: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ue ){.        sq
8e30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8e40: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
8e50: 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20   iParm+1, r3);. 
8e60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8e70: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
8e80: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
8e90: 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LT);.      }.   
8ea0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b     for(i=0; i<nK
8eb0: 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ey; i++){.      
8ec0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8ed0: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
8ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ef0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8f00: 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d  sult + pSO->a[i]
8f10: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
8f20: 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20   - 1,.          
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r2+i);.      }. 
8f50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8f60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
8f70: 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32  uence, iParm, r2
8f80: 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71  +nKey);.      sq
8f90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8fa0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8fb0: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31  , r2, nKey+2, r1
8fc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8fd0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
8fe0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
8ff0: 50 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b  Parm, r1, r2, nK
9000: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28  ey+2);.      if(
9010: 20 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69   addrTest ) sqli
9020: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
9030: 76 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20  v, addrTest);.  
9040: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
9050: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
9060: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
9070: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9080: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c  ange(pParse, r2,
9090: 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20   nKey+2);.      
90a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
90b0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
90c0: 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66  IT_CTE */....#if
90d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
90e0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
90f0: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
9100: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
9110: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
9120: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
9130: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
9140: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
9150: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
9160: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
9170: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
9180: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
9190: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
91a0: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
91b0: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
91c0: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
91d0: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
91e0: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
91f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
9200: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
9210: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
9220: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
9230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9240: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
9250: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
9260: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
9270: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
9280: 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a  ed.  Except, if.
9290: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
92a0: 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68  sorter, in which
92b0: 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72   case the sorter
92c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d   has already lim
92d0: 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75  ited.  ** the ou
92e0: 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a  tput for us..  *
92f0: 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30  /.  if( pSort==0
9300: 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b   && p->iLimit ){
9310: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9320: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
9330: 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c  rJumpZero, p->iL
9340: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
9350: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9360: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
9370: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
9380: 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e  object sufficien
9390: 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f  t for an index o
93a0: 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  f N key columns 
93b0: 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63  and.** X extra c
93c0: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e  olumns..*/.KeyIn
93d0: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
93e0: 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20  foAlloc(sqlite3 
93f0: 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20  *db, int N, int 
9400: 58 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  X){.  int nExtra
9410: 20 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66   = (N+X)*(sizeof
9420: 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 3b 0a 20  (CollSeq*)+1);. 
9430: 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71   KeyInfo *p = sq
9440: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
9450: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4b 65  NN(db, sizeof(Ke
9460: 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72 61 29  yInfo) + nExtra)
9470: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
9480: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d   p->aSortOrder =
9490: 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b   (u8*)&p->aColl[
94a0: 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69  N+X];.    p->nFi
94b0: 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20  eld = (u16)N;.  
94c0: 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28    p->nXField = (
94d0: 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e  u16)X;.    p->en
94e0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
94f0: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
9500: 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
9510: 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20    memset(&p[1], 
9520: 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65  0, nExtra);.  }e
9530: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
9540: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
9550: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
9560: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
9570: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
9580: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
9590: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b  e3KeyInfoUnref(K
95a0: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
95b0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
95c0: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
95d0: 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20      p->nRef--;. 
95e0: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
95f0: 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  0 ) sqlite3DbFre
9600: 65 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d  e(p->db, p);.  }
9610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
9620: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20   new pointer to 
9630: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
9640: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
9650: 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b  ite3KeyInfoRef(K
9660: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
9670: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
9680: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
9690: 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20      p->nRef++;. 
96a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
96b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
96c0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
96d0: 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79  rn TRUE if a Key
96e0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20  Info object can 
96f0: 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  be change.  The 
9700: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
9710: 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68  * can only be ch
9720: 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73  anged if this is
9730: 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72   just a single r
9740: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
9750: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
9760: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
9770: 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f  ed only inside o
9780: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
9790: 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
97a0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
97b0: 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20  iteable(KeyInfo 
97c0: 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e  *p){ return p->n
97d0: 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66  Ref==1; }.#endif
97e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
97f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
9800: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
9810: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
9820: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
9830: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
9840: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
9850: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
9860: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
9870: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
9880: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
9890: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
98a0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
98b0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
98c0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
98d0: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
98e0: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
98f0: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
9900: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
9910: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
9920: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
9930: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
9940: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
9950: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
9960: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
9970: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
9980: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
9990: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
99a0: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
99b0: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
99c0: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
99d0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
99e0: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
99f0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
9a00: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
9a10: 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  oc.  The calling
9a20: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
9a30: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
9a40: 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73  seeing that this
9a50: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
9a60: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
9a70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
9a80: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
9a90: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
9aa0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9ab0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9ac0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
9ad0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
9ae0: 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e  * Form the KeyIn
9af0: 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74  fo object from t
9b00: 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a  his ExprList */.
9b10: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
9b20: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
9b30: 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e  with this column
9b40: 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69   of pList */.  i
9b50: 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20  nt nExtra       
9b60: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
9b70: 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d  many extra colum
9b80: 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f  ns to the end */
9b90: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  .){.  int nExpr;
9ba0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
9bb0: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
9bc0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9bd0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9be0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9bf0: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
9c00: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
9c10: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
9c20: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
9c30: 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c 20  , nExpr-iStart, 
9c40: 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66 28  nExtra+1);.  if(
9c50: 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73   pInfo ){.    as
9c60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
9c70: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
9c80: 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f  pInfo) );.    fo
9c90: 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65  r(i=iStart, pIte
9ca0: 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72  m=pList->a+iStar
9cb0: 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  t; i<nExpr; i++,
9cc0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
9cd0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
9ce0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
9cf0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
9d00: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
9d10: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
9d20: 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
9d30: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
9d40: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
9d50: 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20  aColl[i-iStart] 
9d60: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
9d70: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9d80: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
9d90: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
9da0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9db0: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pInfo;.}../*.*
9dc0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
9dd0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
9de0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
9df0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
9e00: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
9e10: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
9e20: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
9e30: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
9e40: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
9e50: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
9e60: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
9e70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9e80: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
9e90: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
9ea0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9eb0: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
9ec0: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
9ed0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
9ee0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
9ef0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
9f00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
9f10: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
9f20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
9f30: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
9f40: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
9f50: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
9f60: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
9f70: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
9f80: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
9f90: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
9fa0: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
9fb0: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
9fc0: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
9fd0: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
9fe0: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
9ff0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
a000: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
a010: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
a020: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
a030: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
a040: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
a050: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
a060: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
a070: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
a080: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
a090: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
a0a0: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
a0b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
a0c0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
a0d0: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
a0e0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
a0f0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
a100: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
a110: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
a120: 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
a130: 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d  se->db, "USE TEM
a140: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22  P B-TREE FOR %s"
a150: 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73  , zUsage);.    s
a160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a170: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
a180: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
a190: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
a1a0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
a1b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
a1c0: 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20  expression b to 
a1d0: 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f  lvalue a. A seco
a1e0: 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69  nd, no-op, versi
a1f0: 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  on of this macro
a200: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
a210: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54  when SQLITE_OMIT
a220: 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69  _EXPLAIN is defi
a230: 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ned. This allows
a240: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20   the code.** in 
a250: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
a260: 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73  to assign values
a270: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65   to structure me
a280: 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74  mber variables t
a290: 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73  hat.** only exis
a2a0: 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  t if SQLITE_OMIT
a2b0: 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20  _EXPLAIN is not 
a2c0: 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20  defined without 
a2d0: 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a  polluting the.**
a2e0: 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64   code with #ifnd
a2f0: 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  ef directives..*
a300: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
a310: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20  inSetInteger(a, 
a320: 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a  b) a = b..#else.
a330: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
a340: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
a350: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
a360: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
a370: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54   define explainT
a380: 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20  empTable(y,z).# 
a390: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
a3a0: 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65  tInteger(y,z).#e
a3b0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
a3c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
a3d0: 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69  XPLAIN) && !defi
a3e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a3f0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29  COMPOUND_SELECT)
a400: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
a410: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
a420: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
a430: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
a440: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
a450: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
a460: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
a470: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
a480: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
a490: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
a4a0: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
a4b0: 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
a4c0: 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a  e two forms:.**.
a4d0: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
a4e0: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
a4f0: 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22   and iSub2 (op)"
a500: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
a510: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
a520: 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e  1 and iSub2 USIN
a530: 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f  G TEMP B-TREE (o
a540: 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  p)".**.** where 
a550: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
a560: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73  are the integers
a570: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63   passed as the c
a580: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
a590: 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
a5a0: 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74  ers, and op is t
a5b0: 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
a5c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  tation of the pa
a5d0: 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
a5e0: 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65  e same name. The
a5f0: 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20   parameter "op" 
a600: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54  must be one of T
a610: 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
a620: 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53  PT,.** TK_INTERS
a630: 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54  ECT or TK_ALL. T
a640: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73  he first form is
a650: 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e   used if argumen
a660: 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a  t bUseTmp is .**
a670: 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73   false, or the s
a680: 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74  econd form if it
a690: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
a6a0: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
a6b0: 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72  Composite(.  Par
a6c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6e0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
a6f0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a710: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
a720: 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
a730: 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   etc. */.  int i
a740: 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20  Sub1,           
a750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
a760: 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20  bquery id 1 */. 
a770: 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20   int iSub2,     
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
a7a0: 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54  2 */.  int bUseT
a7b0: 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mp              
a7c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a7d0: 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77  f a temp table w
a7e0: 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20  as used */.){.  
a7f0: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55  assert( op==TK_U
a800: 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45  NION || op==TK_E
a810: 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
a820: 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d  INTERSECT || op=
a830: 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28  =TK_ALL );.  if(
a840: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
a850: 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==2 ){.    Vdbe 
a860: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a870: 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  be;.    char *zM
a880: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
a890: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61  ntf(.        pPa
a8a0: 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55  rse->db, "COMPOU
a8b0: 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64  ND SUBQUERIES %d
a8c0: 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c   AND %d %s(%s)",
a8d0: 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20   iSub1, iSub2,. 
a8e0: 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22         bUseTmp?"
a8f0: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
a900: 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70  E ":"", selectOp
a910: 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a  Name(op).    );.
a920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a930: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
a940: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
a950: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
a960: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
a970: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20  .  }.}.#else./* 
a980: 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f  No-op versions o
a990: 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58  f the explainXXX
a9a0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  () functions and
a9b0: 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65   macros. */.# de
a9c0: 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70  fine explainComp
a9d0: 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29  osite(v,w,x,y,z)
a9e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
a9f0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
aa00: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
aa10: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
aa20: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
aa30: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
aa40: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
aa50: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
aa60: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
aa70: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
aa80: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
aa90: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
aaa0: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
aab0: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
aac0: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
aad0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
aae0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
aaf0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
ab00: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
ab10: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
ab20: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
ab30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ab40: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
ab50: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
ab60: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
ab70: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
ab80: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
ab90: 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  on the ORDER BY 
aba0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
abb0: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  nColumn,      /*
abc0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
abd0: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
abe0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
abf0: 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73  t /* Write the s
ac00: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
ac10: 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  re */.){.  Vdbe 
ac20: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
ac30: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
ac40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
ac50: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ac60: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  t */.  int addrB
ac70: 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c 61  reak = pSort->la
ac80: 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  belDone;        
ac90: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
aca0: 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f   to exit loop */
acb0: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69  .  int addrConti
acc0: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
acd0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
ace0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72  /* Jump here for
acf0: 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
ad00: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74   int addr;.  int
ad10: 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20   addrOnce = 0;. 
ad20: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70   int iTab;.  Exp
ad30: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
ad40: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
ad50: 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  y;.  int eDest =
ad60: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
ad70: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
ad80: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69  st->iSDParm;.  i
ad90: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
ada0: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74   regRowid;.  int
adb0: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65   iCol;.  int nKe
adc0: 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74 54 61  y;.  int iSortTa
add0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
ade0: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
adf0: 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72  ursor to read fr
ae00: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6f 72  om */.  int nSor
ae10: 74 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  tData;          
ae20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 69 6c          /* Trail
ae30: 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 72 65  ing values to re
ae40: 61 64 20 66 72 6f 6d 20 73 6f 72 74 65 72 20 2a  ad from sorter *
ae50: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  /.  int i;.  int
ae60: 20 62 53 65 71 3b 20 20 20 20 20 20 20 20 20 20   bSeq;          
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae80: 54 72 75 65 20 69 66 20 73 6f 72 74 65 72 20 72  True if sorter r
ae90: 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73 20 73  ecord includes s
aea0: 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20 73 74 72  eq. no. */.  str
aeb0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
aec0: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
aed0: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
aee0: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
aef0: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
af00: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
af10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
af20: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
af30: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
af40: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
af50: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
af60: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
af70: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
af80: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
af90: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
afa0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
afb0: 7d 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74  }.  iTab = pSort
afc0: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66  ->iECursor;.  if
afd0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
afe0: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
aff0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65  T_Coroutine || e
b000: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b  Dest==SRT_Mem ){
b010: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
b020: 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  0;.    regRow = 
b030: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
b040: 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 6e 43    nSortData = nC
b050: 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  olumn;.  }else{.
b060: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
b070: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
b080: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65  (pParse);.    re
b090: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
b0a0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
b0b0: 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  e, nColumn);.   
b0c0: 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 6e 43 6f   nSortData = nCo
b0d0: 6c 75 6d 6e 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79  lumn;.  }.  nKey
b0e0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
b0f0: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
b100: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
b110: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
b120: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
b130: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
b140: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
b150: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
b160: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
b170: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
b180: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
b190: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
b1a0: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
b1b0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
b1c0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
b1d0: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
b1e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b1f0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
b200: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
b210: 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b  SortOut, nKey+1+
b220: 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20  nSortData);.    
b230: 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73  if( addrOnce ) s
b240: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b250: 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b  re(v, addrOnce);
b260: 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20  .    addr = 1 + 
b270: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b280: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
b290: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
b2a0: 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
b2b0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63  verage(v);.    c
b2c0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
b2d0: 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  iOffset, addrCon
b2e0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
b2f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b300: 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
b310: 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  iTab, regSortOut
b320: 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20  , iSortTab);.   
b330: 20 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c   bSeq = 0;.  }el
b340: 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  se{.    addr = 1
b350: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
b360: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  dOp2(v, OP_Sort,
b370: 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b   iTab, addrBreak
b380: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b390: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
b3a0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
b3b0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
b3c0: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
b3d0: 69 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d  iTab;.    bSeq =
b3e0: 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   1;.  }.  for(i=
b3f0: 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65  0, iCol=nKey+bSe
b400: 71 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20  q; i<nSortData; 
b410: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 52  i++){.    int iR
b420: 65 61 64 3b 0a 20 20 20 20 69 66 28 20 61 4f 75  ead;.    if( aOu
b430: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
b440: 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  rByCol ){.      
b450: 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78 5b 69  iRead = aOutEx[i
b460: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
b470: 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  l-1;.    }else{.
b480: 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 69 43        iRead = iC
b490: 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol++;.    }.    
b4a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b4b0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
b4c0: 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64 2c  iSortTab, iRead,
b4d0: 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20   regRow+i);.    
b4e0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b4f0: 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  "%s", aOutEx[i].
b500: 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69  zName ? aOutEx[i
b510: 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78  ].zName : aOutEx
b520: 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d  [i].zSpan));.  }
b530: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
b540: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
b550: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
b560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b570: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
b580: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  wid, iParm, regR
b590: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
b5a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b5b0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
b5c0: 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  rm, regRow, regR
b5d0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
b5e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
b5f0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
b600: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
b610: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b620: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b630: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
b640: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
b650: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73  sert( nColumn==s
b660: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
b670: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20  Dest->zAffSdst) 
b680: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b690: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
b6a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
b6b0: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65  Row, nColumn, re
b6c0: 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20  gRowid,.        
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c  pDest->zAffSdst,
b6f0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
b700: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
b710: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
b720: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
b730: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
b740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b750: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
b760: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
b770: 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e  Rowid, regRow, n
b780: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
b790: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b7a0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
b7b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
b7c0: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
b7d0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
b7e0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
b7f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b800: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
b810: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
b820: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
b830: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
b840: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
b850: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b860: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
b870: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
b880: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
b890: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
b8a0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
b8b0: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
b8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b8d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
b8e0: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
b8f0: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
b900: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b910: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
b920: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
b930: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
b940: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
b950: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b960: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b970: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
b980: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
b990: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b9a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b9b0: 20 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20   regRowid ){.   
b9c0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b9d0: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Set ){.      sql
b9e0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
b9f0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
ba00: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Row, nColumn);. 
ba10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ba20: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
ba30: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
ba40: 67 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gRow);.    }.   
ba50: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ba60: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
ba70: 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  egRowid);.  }.  
ba80: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
ba90: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
baa0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
bab0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
bac0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
bad0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
bae0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
baf0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
bb00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bb10: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
bb20: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
bb30: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
bb40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
bb50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bb60: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
bb70: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
bb80: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
bb90: 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  f( pSort->regRet
bba0: 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  urn ) sqlite3Vdb
bbb0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
bbc0: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67  turn, pSort->reg
bbd0: 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74  Return);.  sqlit
bbe0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
bbf0: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
bc00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
bc10: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
bc20: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
bc30: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
bc40: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
bc50: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
bc60: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
bc70: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
bc80: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
bc90: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
bca0: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
bcb0: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
bcc0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
bcd0: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
bce0: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
bcf0: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
bd00: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
bd10: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
bd20: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
bd30: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
bd40: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
bd50: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
bd60: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
bd70: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bd80: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
bd90: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
bda0: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
bdb0: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
bdc0: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
bdd0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
bde0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
bdf0: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
be00: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
be10: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
be20: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
be30: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
be40: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
be50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
be60: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
be70: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
be80: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
be90: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
bea0: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
beb0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
bec0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
bed0: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
bee0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
bef0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
bf00: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
bf10: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
bf20: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
bf30: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
bf40: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
bf50: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
bf60: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
bf70: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
bf80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
bf90: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
bfa0: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
bfb0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
bfc0: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
bfd0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
bfe0: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
bff0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
c000: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
c010: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c020: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c030: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
c040: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
c050: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
c060: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 23 65  (A,B,C,D,E,F).#e
c070: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
c080: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
c090: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c0a0: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
c0b0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
c0c0: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
c0d0: 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 23 65 6e 64  Impl(A,B,F).#end
c0e0: 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  if.static const 
c0f0: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
c100: 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Impl(.  NameCont
c110: 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70  ext *pNC, .  Exp
c120: 72 20 2a 70 45 78 70 72 2c 0a 23 69 66 64 65 66  r *pExpr,.#ifdef
c130: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c140: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
c150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
c160: 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20  OrigDb,.  const 
c170: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62  char **pzOrigTab
c180: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
c190: 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 23 65 6e 64  *pzOrigCol,.#end
c1a0: 69 66 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  if.  u8 *pEstWid
c1b0: 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  th.){.  char con
c1c0: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
c1d0: 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74   int j;.  u8 est
c1e0: 57 69 64 74 68 20 3d 20 31 3b 0a 23 69 66 64 65  Width = 1;.#ifde
c1f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c200: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
c210: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
c220: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61  rigDb = 0;.  cha
c230: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61  r const *zOrigTa
c240: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
c250: 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  nst *zOrigCol = 
c260: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
c270: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
c280: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
c290: 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
c2a0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
c2b0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
c2c0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
c2d0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
c2e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
c2f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
c300: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
c310: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
c320: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
c330: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
c340: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
c350: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
c360: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
c370: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
c380: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
c390: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
c3a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
c3b0: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
c3c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
c3d0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
c3e0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
c3f0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
c400: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
c410: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
c420: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
c430: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c440: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
c450: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
c460: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
c470: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
c480: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
c490: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
c4a0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
c4b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c4c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
c4d0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
c4e0: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
c4f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
c500: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
c510: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
c520: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
c530: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
c540: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
c550: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
c560: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
c570: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
c580: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
c590: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
c5a0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
c5b0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
c5c0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
c5d0: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
c5e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c5f0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
c600: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
c610: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c620: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
c630: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
c640: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
c650: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
c660: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
c670: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
c680: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
c690: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
c6a0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
c6b0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
c6c0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
c6d0: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
c6e0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
c6f0: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
c700: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
c710: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
c720: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
c730: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
c740: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
c750: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
c760: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
c770: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
c780: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
c790: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
c7a0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
c7b0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
c7c0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
c7d0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
c7e0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
c7f0: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
c800: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
c810: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
c820: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
c830: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
c840: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
c850: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
c860: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
c870: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
c880: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
c890: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
c8a0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
c8b0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
c8c0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
c8d0: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
c8e0: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
c8f0: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
c900: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
c910: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
c920: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
c930: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
c940: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
c950: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
c960: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
c970: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
c980: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
c990: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
c9a0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
c9b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
c9c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
c9d0: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
c9e0: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
c9f0: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
ca00: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
ca10: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
ca20: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
ca30: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
ca40: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
ca50: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
ca60: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
ca70: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
ca80: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
ca90: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
caa0: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
cab0: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
cac0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
cad0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
cae0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
caf0: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d   ALWAYS(iCol<pS-
cb00: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
cb10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
cb20: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
cb30: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
cb40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
cb50: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
cb60: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
cb70: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
cb80: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
cb90: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
cba0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
cbb0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
cbc0: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
cbd0: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
cbe0: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
cbf0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
cc00: 20 2a 2a 20 54 68 65 20 41 4c 57 41 59 53 28 29   ** The ALWAYS()
cc10: 20 69 73 20 62 65 63 61 75 73 65 20 69 43 6f 6c   is because iCol
cc20: 3e 3d 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  >=pS->pEList->nE
cc30: 78 70 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65  xpr will have be
cc40: 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  en.          ** 
cc50: 63 61 75 67 68 74 20 61 6c 72 65 61 64 79 20 62  caught already b
cc60: 79 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  y name resolutio
cc70: 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  n..          */.
cc80: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f            NameCo
cc90: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
cca0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
ccb0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  S->pEList->a[iCo
ccc0: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  l].pExpr;.      
ccd0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
cce0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
ccf0: 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74         sNC.pNext
cd00: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20   = pNC;.        
cd10: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
cd20: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
cd30: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
cd40: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
cd50: 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67  ,&zOrigDb,&zOrig
cd60: 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  Tab,&zOrigCol, &
cd70: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
cd80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
cd90: 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68  e if( pTab->pSch
cda0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ema ){.        /
cdb0: 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a  * A real table *
cdc0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
cdd0: 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20  ( !pS );.       
cde0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
cdf0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
ce00: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ce10: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
ce20: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
ce30: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69  Tab->nCol) );.#i
ce40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ce50: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
ce60: 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  TA.        if( i
ce70: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
ce80: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
ce90: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
cea0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
ceb0: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
cec0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e{.          zOr
ced0: 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  igCol = pTab->aC
cee0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
cef0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
cf00: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
cf10: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
cf20: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
cf30: 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70      estWidth = p
cf40: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
cf50: 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  szEst;.        }
cf60: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61  .        zOrigTa
cf70: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
cf80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
cf90: 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ->pParse ){.    
cfa0: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
cfb0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
cfc0: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
cfd0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
cfe0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
cff0: 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70  zOrigDb = pNC->p
d000: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
d010: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
d020: 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
d030: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
d040: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
d050: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
d060: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d070: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
d080: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
d090: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
d0a0: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
d0b0: 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70      estWidth = p
d0c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
d0d0: 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  szEst;.        }
d0e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
d0f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d100: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
d110: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
d120: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
d130: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
d140: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d150: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
d160: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
d170: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
d180: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
d190: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
d1a0: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
d1b0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d1c0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
d1d0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
d1e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
d1f0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
d200: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
d210: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
d220: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
d230: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
d240: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
d250: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
d260: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
d270: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
d280: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
d290: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
d2a0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
d2b0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
d2c0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
d2d0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
d2e0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d2f0: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
d300: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
d310: 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64  OrigCol, &estWid
d320: 74 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  th); .      brea
d330: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
d340: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
d350: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
d360: 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66  _METADATA  .  if
d370: 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20  ( pzOrigDb ){.  
d380: 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67    assert( pzOrig
d390: 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c  Tab && pzOrigCol
d3a0: 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44   );.    *pzOrigD
d3b0: 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20  b = zOrigDb;.   
d3c0: 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f   *pzOrigTab = zO
d3d0: 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f  rigTab;.    *pzO
d3e0: 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f  rigCol = zOrigCo
d3f0: 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  l;.  }.#endif.  
d400: 69 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20  if( pEstWidth ) 
d410: 2a 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74  *pEstWidth = est
d420: 57 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20  Width;.  return 
d430: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
d440: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
d450: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
d460: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
d470: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
d480: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
d490: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
d4a0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
d4b0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
d4c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d4d0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
d4e0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
d4f0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
d500: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
d510: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
d520: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
d530: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
d540: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
d550: 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  set */.){.#ifnde
d560: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
d570: 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76  CLTYPE.  Vdbe *v
d580: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d590: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
d5a0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
d5b0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
d5c0: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
d5d0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
d5e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
d5f0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d600: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
d610: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
d620: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
d630: 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65  ar *zType;.#ifde
d640: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d650: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
d660: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d670: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
d680: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
d690: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
d6a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
d6b0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79  Col = 0;.    zTy
d6c0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d6d0: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
d6e0: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
d6f0: 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20  OrigCol, 0);..  
d700: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
d710: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
d720: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
d730: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
d740: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
d750: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
d760: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
d770: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
d780: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
d790: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
d7a0: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
d7b0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
d7c0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d7d0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
d7e0: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
d7f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d800: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d810: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d820: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
d830: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
d840: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d860: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d870: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
d880: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
d890: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
d8a0: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
d8b0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d8c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , 0, 0, 0, 0);.#
d8d0: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
d8e0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d8f0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
d900: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
d910: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d920: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
d930: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d940: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
d950: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  /.}../*.** Gener
d960: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
d970: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
d980: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
d990: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
d9a0: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
d9b0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
d9c0: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
d9d0: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
d9e0: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
d9f0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
da00: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
da10: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
da20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
da30: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
da40: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
da50: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
da60: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
da70: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
da80: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
da90: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
daa0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
dab0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
dac0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
dad0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
dae0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
daf0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
db00: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
db10: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
db20: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
db30: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
db40: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
db50: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
db60: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
db70: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
db80: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
db90: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
dba0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62  olNamesSet || db
dbb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
dbc0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
dbd0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
dbe0: 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30  ert( pTabList!=0
dbf0: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   );.  pParse->co
dc00: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
dc10: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
dc20: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
dc30: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
dc40: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
dc50: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
dc60: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
dc70: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
dc80: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
dc90: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
dca0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
dcb0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
dcc0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
dcd0: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
dce0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
dcf0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
dd00: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
dd10: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
dd20: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
dd30: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
dd40: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
dd50: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
dd60: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
dd70: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
dd80: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
dd90: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
dda0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
ddb0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
ddc0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43   p->op==TK_AGG_C
ddd0: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 54  OLUMN ){.      T
dde0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
ddf0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
de00: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
de10: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
de20: 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53   for(j=0; ALWAYS
de30: 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  (j<pTabList->nSr
de40: 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  c); j++){.      
de50: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
de60: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d  a[j].iCursor==p-
de70: 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b  >iTable ) break;
de80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
de90: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
dea0: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
deb0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
dec0: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
ded0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
dee0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
def0: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
df00: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
df10: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
df20: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
df30: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
df40: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
df50: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
df60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
df70: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
df80: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
df90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
dfa0: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
dfb0: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
dfc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dfd0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
dfe0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e000: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e010: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
e020: 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  an), SQLITE_DYNA
e030: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
e040: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
e050: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
e060: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
e070: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e080: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e090: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
e0a0: 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ame, zCol);.    
e0b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e0c0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
e0d0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
e0e0: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  ame, SQLITE_DYNA
e0f0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
e100: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
e110: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
e120: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
e130: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54  AME, zCol, SQLIT
e140: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
e150: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
e160: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
e170: 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *z = pEList->a
e180: 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
e190: 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69   z = z==0 ? sqli
e1a0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e1b0: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20  column%d", i+1) 
e1c0: 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  : sqlite3DbStrDu
e1d0: 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  p(db, z);.      
e1e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e1f0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
e200: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c  AME_NAME, z, SQL
e210: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
e220: 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
e230: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
e240: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
e250: 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
e260: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
e270: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
e280: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
e290: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
e2a0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
e2b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e2c0: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
e2d0: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
e2e0: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
e2f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
e300: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
e310: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
e320: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
e330: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
e340: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
e350: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
e360: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
e370: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
e380: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
e390: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
e3a0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
e3b0: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
e3c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
e3d0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e3e0: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
e3f0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
e400: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
e410: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
e420: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
e430: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
e440: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
e450: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 75  .int sqlite3Colu
e460: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
e470: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e480: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
e490: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
e4a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
e4b0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
e4c0: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
e4d0: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
e4e0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
e4f0: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
e500: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
e510: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
e520: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
e530: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
e540: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
e550: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
e560: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
e570: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e580: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
e590: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
e5a0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
e5b0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
e5c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e5d0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32 20  unters */.  u32 
e5e0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
e5f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
e600: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
e610: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
e620: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
e630: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
e640: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
e650: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
e660: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
e670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e680: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e690: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
e6a0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
e6b0: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
e6d0: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
e6e0: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
e6f0: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
e700: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
e710: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
e720: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
e730: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
e740: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e750: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
e760: 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20   */.  Hash ht;  
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
e790: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
e7a0: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73  */..  sqlite3Has
e7b0: 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66  hInit(&ht);.  if
e7c0: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
e7d0: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
e7e0: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
e7f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
e800: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
e810: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
e820: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
e830: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==0 );.  }else
e840: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
e850: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
e860: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
e870: 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20  ==(i16)nCol );. 
e880: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a   *pnCol = nCol;.
e890: 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b    *paCol = aCol;
e8a0: 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ..  for(i=0, pCo
e8b0: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26  l=aCol; i<nCol &
e8c0: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
e8d0: 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  led; i++, pCol++
e8e0: 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
e8f0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
e900: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
e910: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
e920: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
e930: 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
e940: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
e950: 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
e960: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
e970: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
e980: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
e990: 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
e9a0: 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
e9b0: 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
e9c0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  name */.    }els
e9d0: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
e9e0: 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a  ColExpr = p;  /*
e9f0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
ea00: 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75  that is the resu
ea10: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  lt column name *
ea20: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
ea30: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
ea40: 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  Table associated
ea50: 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65   with this expre
ea60: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ssion */.      w
ea70: 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
ea80: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
ea90: 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d        pColExpr =
eaa0: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68   pColExpr->pRigh
eab0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
eac0: 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29  t( pColExpr!=0 )
ead0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
eae0: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
eaf0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  ==TK_COLUMN && A
eb00: 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e  LWAYS(pColExpr->
eb10: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
eb20: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
eb30: 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d  ns use the colum
eb40: 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  n name name */. 
eb50: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
eb60: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c  = pColExpr->iCol
eb70: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  umn;.        pTa
eb80: 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54  b = pColExpr->pT
eb90: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ab;.        if( 
eba0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
ebb0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
ebc0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f       zName = iCo
ebd0: 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f  l>=0 ? pTab->aCo
ebe0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20  l[iCol].zName : 
ebf0: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
ec00: 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70  else if( pColExp
ec10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  r->op==TK_ID ){.
ec20: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ec30: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
ec40: 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e  (pColExpr, EP_In
ec50: 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
ec60: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45     zName = pColE
ec70: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
ec80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ec90: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
eca0: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
ecb0: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
ecc0: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
ecd0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61  e */.        zNa
ece0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
ecf0: 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d  ].zSpan;.      }
ed00: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
ed10: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
ed20: 66 28 64 62 2c 20 22 25 73 22 2c 20 7a 4e 61 6d  f(db, "%s", zNam
ed30: 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  e);..    /* Make
ed40: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
ed50: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
ed60: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
ed70: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
ed80: 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e   ** append an in
ed90: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
eda0: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
edb0: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
edc0: 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   */.    cnt = 0;
edd0: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d  .    while( zNam
ede0: 65 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68  e && sqlite3Hash
edf0: 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29  Find(&ht, zName)
ee00: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61  !=0 ){.      nNa
ee10: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
ee20: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
ee30: 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29     if( nName>0 )
ee40: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
ee50: 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20  nName-1; j>0 && 
ee60: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
ee70: 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d  Name[j]); j--){}
ee80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
ee90: 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61  me[j]==':' ) nNa
eea0: 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a  me = j;.      }.
eeb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
eec0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
eed0: 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d   "%.*z:%u", nNam
eee0: 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29  e, zName, ++cnt)
eef0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e  ;.      if( cnt>
ef00: 33 20 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  3 ) sqlite3_rand
ef10: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e  omness(sizeof(cn
ef20: 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d  t), &cnt);.    }
ef30: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
ef40: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71   = zName;.    sq
ef50: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
ef60: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c  rtiesFromName(0,
ef70: 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   pCol);.    if( 
ef80: 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  zName && sqlite3
ef90: 48 61 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20  HashInsert(&ht, 
efa0: 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43  zName, pCol)==pC
efb0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
efc0: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
efd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
efe0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 68  ite3HashClear(&h
eff0: 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  t);.  if( db->ma
f000: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
f010: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
f020: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
f030: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
f040: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
f050: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
f060: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
f070: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
f080: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
f090: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f0a0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
f0b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
f0c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f0d0: 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  Add type and col
f0e0: 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
f0f0: 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c  on to a column l
f100: 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ist based on.** 
f110: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
f120: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63  nt..** .** The c
f130: 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75  olumn list presu
f140: 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20  mably came from 
f150: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65  selectColumnName
f160: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e  sFromExprList().
f170: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
f180: 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d  ist has only nam
f190: 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72  es, not types or
f1a0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68   collations.  Th
f1b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f  is.** routine go
f1c0: 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61  es through and a
f1d0: 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e  dds the types an
f1e0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a  d collations..**
f1f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f200: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61   requires that a
f210: 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  ll identifiers i
f220: 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20  n the SELECT.** 
f230: 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73  statement be res
f240: 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olved..*/.void s
f250: 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43  qlite3SelectAddC
f260: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
f270: 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ation(.  Parse *
f280: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
f290: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
f2a0: 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ts */.  Table *p
f2b0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
f2c0: 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65   Add column type
f2d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
f2e0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
f2f0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
f300: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
f310: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
f320: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
f330: 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73  ations */.){.  s
f340: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
f350: 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43  rse->db;.  NameC
f360: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f  ontext sNC;.  Co
f370: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f  lumn *pCol;.  Co
f380: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
f390: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
f3a0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
f3b0: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75  ist_item *a;.  u
f3c0: 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20  64 szAll = 0;.. 
f3d0: 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74   assert( pSelect
f3e0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f3f0: 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c   (pSelect->selFl
f400: 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
f410: 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  d)!=0 );.  asser
f420: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70  t( pTab->nCol==p
f430: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
f440: 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
f450: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
f460: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f470: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
f480: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
f490: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
f4a0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
f4b0: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
f4c0: 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  a = pSelect->pEL
f4d0: 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  ist->a;.  for(i=
f4e0: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
f4f0: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
f500: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
f510: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f520: 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e  zType;.    int n
f530: 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69  , m;.    p = a[i
f540: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a 54 79  ].pExpr;.    zTy
f550: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f560: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
f570: 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b  , &pCol->szEst);
f580: 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43  .    szAll += pC
f590: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70  ol->szEst;.    p
f5a0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
f5b0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
f5c0: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
f5d0: 7a 54 79 70 65 20 26 26 20 28 6d 20 3d 20 73 71  zType && (m = sq
f5e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
f5f0: 79 70 65 29 29 3e 30 20 29 7b 0a 20 20 20 20 20  ype))>0 ){.     
f600: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
f610: 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  en30(pCol->zName
f620: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  );.      pCol->z
f630: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
f640: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62  ReallocOrFree(db
f650: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pCol->zName, n
f660: 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28  +m+2);.      if(
f670: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a   pCol->zName ){.
f680: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
f690: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d  pCol->zName[n+1]
f6a0: 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20  , zType, m+1);. 
f6b0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c         pCol->col
f6c0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
f6d0: 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20  _HASTYPE;.      
f6e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
f6f0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
f700: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
f710: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
f720: 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  BLOB;.    pColl 
f730: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
f740: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
f750: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  .    if( pColl &
f760: 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30  & pCol->zColl==0
f770: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
f780: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44  zColl = sqlite3D
f790: 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c  bStrDup(db, pCol
f7a0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
f7b0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54  .  }.  pTab->szT
f7c0: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
f7d0: 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a  ogEst(szAll*4);.
f7e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
f7f0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f800: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
f810: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
f820: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
f830: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
f840: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
f850: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
f860: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
f870: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
f880: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
f890: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
f8a0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
f8b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
f8c0: 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
f8d0: 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
f8e0: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
f8f0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
f900: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
f910: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
f920: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
f930: 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
f940: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
f950: 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
f960: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
f970: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
f980: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
f990: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
f9a0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
f9b0: 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
f9c0: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
f9d0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
f9e0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
f9f0: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
fa00: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
fa10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fa20: 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
fa30: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
fa40: 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
fa50: 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
fa60: 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
fa70: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
fa80: 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
fa90: 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
faa0: 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54  le );.  pTab->nT
fab0: 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  abRef = 1;.  pTa
fac0: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
fad0: 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
fae0: 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
faf0: 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
fb00: 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
fb10: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
fb20: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
fb30: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
fb40: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
fb50: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
fb60: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
fb70: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
fb80: 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
fb90: 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
fba0: 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
fbb0: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
fbc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
fbd0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
fbe0: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
fbf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
fc00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
fc10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
fc20: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
fc30: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
fc40: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
fc50: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
fc60: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
fc70: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fc80: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
fc90: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
fca0: 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arse..*/.static 
fcb0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
fcc0: 56 64 62 65 20 2a 61 6c 6c 6f 63 56 64 62 65 28  Vdbe *allocVdbe(
fcd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
fce0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
fcf0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
fd00: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
fd10: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
fd20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fd30: 70 32 28 76 2c 20 4f 50 5f 49 6e 69 74 2c 20 30  p2(v, OP_Init, 0
fd40: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 1);.  if( pPar
fd50: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
fd60: 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
fd70: 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
fd80: 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63  e->db,SQLITE_Fac
fd90: 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29  torOutConst).  )
fda0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b  {.    pParse->ok
fdb0: 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b  ConstFactor = 1;
fdc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
fdd0: 0a 7d 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  .}.Vdbe *sqlite3
fde0: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
fdf0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
fe00: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
fe10: 65 3b 0a 20 20 72 65 74 75 72 6e 20 76 20 3f 20  e;.  return v ? 
fe20: 76 20 3a 20 61 6c 6c 6f 63 56 64 62 65 28 70 50  v : allocVdbe(pP
fe30: 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  arse);.}.../*.**
fe40: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
fe50: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
fe60: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
fe70: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
fe80: 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20  e.** pLimit and 
fe90: 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69  pOffset expressi
fea0: 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64  ons.  pLimit and
feb0: 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   pOffset hold th
fec0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
fed0: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
fee0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
fef0: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
ff00: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
ff10: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
ff20: 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
ff30: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
ff40: 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
ff50: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
ff60: 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
ff70: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
ff80: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
ff90: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
ffa0: 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
ffb0: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
ffc0: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
ffd0: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
ffe0: 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
fff0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
10000 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
10010 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10020 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
10030 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20  alues of iLimit 
10040 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
10050 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
10060 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
10070 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e  ned by pLimit an
10080 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d pOffset.  iLim
10090 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
100a0 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
100b0 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
100c0 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
100d0 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a   values (zero).*
100e0 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  * prior to calli
100f0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
10100 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73  .**.** The iOffs
10110 65 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20  et register (if 
10120 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
10130 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
10140 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
10150 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c   OFFSET.  The iL
10160 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73  imit register is
10170 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
10180 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72  LIMIT.  Register
10190 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73  .** iOffset+1 is
101a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
101b0 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a  LIMIT+OFFSET..**
101c0 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
101d0 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
101e0 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
101f0 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
10200 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
10210 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
10220 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
10230 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
10240 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
10250 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
10260 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
10270 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
10280 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
10290 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
102a0 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
102b0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
102c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
102d0 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
102e0 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
102f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
10300 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
10310 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ffset;.  int n;.
10320 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
10330 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
10340 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
10350 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
10360 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
10370 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
10380 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
10390 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
103a0 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
103b0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
103c0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
103d0 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
103e0 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
103f0 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
10400 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
10410 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
10420 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e);.  assert( p-
10430 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >pOffset==0 || p
10440 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  ->pLimit!=0 );. 
10450 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
10460 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  {.    p->iLimit 
10470 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
10480 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
10490 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
104a0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  e(pParse);.    a
104b0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
104c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
104d0 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
104e0 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
104f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
10510 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
10520 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
10530 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
10540 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
10550 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
10560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
10570 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  oto(v, iBreak);.
10580 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10590 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  n>=0 && p->nSele
105a0 63 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67  ctRow>sqlite3Log
105b0 45 73 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20  Est((u64)n) ){. 
105c0 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
105d0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
105e0 67 45 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20  gEst((u64)n);.  
105f0 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
10600 73 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d  s |= SF_FixedLim
10610 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
10620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
10630 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10640 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
10650 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
10660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10670 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
10680 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
10690 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
106a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
106b0 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
106c0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
106d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
106e0 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74  OP_IfNot, iLimit
106f0 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
10700 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
10710 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66  }.    if( p->pOf
10720 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  fset ){.      p-
10730 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
10740 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
10750 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
10760 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
10770 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
10780 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
10790 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
107a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
107b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
107c0 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
107d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
107e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
107f0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66  _MustBeInt, iOff
10800 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
10810 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
10820 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
10830 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
10840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10850 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
10860 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d  ffsetLimit, iLim
10870 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69  it, iOffset+1, i
10880 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56  Offset);.      V
10890 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
108a0 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b  LIMIT+OFFSET"));
108b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
108c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
108d0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
108e0 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
108f0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
10900 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10910 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
10920 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
10930 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
10940 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
10950 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
10960 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
10970 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
10980 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
10990 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
109a0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
109b0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
109c0 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
109d0 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
109e0 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
109f0 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
10a00 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
10a10 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
10a20 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
10a30 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
10a40 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
10a50 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
10a60 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10a70 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
10a80 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
10a90 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
10aa0 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
10ab0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
10ac0 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
10ad0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10ae0 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
10af0 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
10b00 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73  );.  /* iCol mus
10b10 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70  t be less than p
10b20 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e  ->pEList->nExpr.
10b30 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65    Otherwise an e
10b40 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  rror would.  ** 
10b50 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e  have been thrown
10b60 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73   during name res
10b70 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77  olution and we w
10b80 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f  ould not have go
10b90 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66  tten.  ** this f
10ba0 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74  ar */.  if( pRet
10bb0 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  ==0 && ALWAYS(iC
10bc0 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ol<p->pEList->nE
10bd0 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74  xpr) ){.    pRet
10be0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10bf0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
10c00 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
10c10 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
10c20 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
10c30 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
10c40 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
10c50 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
10c60 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f  arameter is a co
10c70 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a  mpound SELECT.**
10c80 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
10c90 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66  Y clause. This f
10ca0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
10cb0 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
10cc0 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  KeyInfo.** struc
10cd0 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f  ture suitable fo
10ce0 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  r implementing t
10cf0 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a  he ORDER BY..**.
10d00 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
10d10 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
10d20 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
10d30 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
10d40 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
10d50 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
10d60 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72  nsible for ensur
10d70 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
10d80 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
10d90 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
10da0 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
10db0 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  o *multiSelectOr
10dc0 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72  derByKeyInfo(Par
10dd0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
10de0 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72  ct *p, int nExtr
10df0 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  a){.  ExprList *
10e00 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
10e10 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f  rderBy;.  int nO
10e20 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
10e30 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73  erBy->nExpr;.  s
10e40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
10e50 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e  rse->db;.  KeyIn
10e60 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  fo *pRet = sqlit
10e70 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
10e80 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74  b, nOrderBy+nExt
10e90 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52  ra, 1);.  if( pR
10ea0 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
10eb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10ec0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
10ed0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
10ee0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
10ef0 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61  m = &pOrderBy->a
10f00 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20  [i];.      Expr 
10f10 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e  *pTerm = pItem->
10f20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c  pExpr;.      Col
10f30 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
10f40 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
10f50 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
10f60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  e ){.        pCo
10f70 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
10f80 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10f90 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  pTerm);.      }e
10fa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
10fb0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
10fc0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10fd0 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  p, pItem->u.x.iO
10fe0 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20  rderByCol-1);.  
10ff0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
11000 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  =0 ) pColl = db-
11010 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
11020 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
11030 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20  i].pExpr =.     
11040 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11050 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
11060 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
11070 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
11080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
11090 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
110a0 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
110b0 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52  Ret) );.      pR
110c0 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  et->aColl[i] = p
110d0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74  Coll;.      pRet
110e0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
110f0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
11100 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
11110 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
11120 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pRet;.}..#ifndef
11130 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
11140 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11150 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44  ine generates VD
11160 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  BE code to compu
11170 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  te the content o
11180 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49  f a WITH RECURSI
11190 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74  VE.** query of t
111a0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
111b0 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c   <recursive-tabl
111c0 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75  e> AS (<setup-qu
111d0 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  ery> UNION [ALL]
111e0 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72   <recursive-quer
111f0 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  y>).**          
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
11210 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
11220 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
11230 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
11260 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
11270 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a         p.**.**.*
11280 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  * There is exact
11290 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  ly one reference
112a0 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76   to the recursiv
112b0 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e-table in the F
112c0 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66  ROM clause.** of
112d0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
112e0 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68  , marked with th
112f0 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66  e SrcList->a[].f
11300 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c  g.isRecursive fl
11310 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ag..**.** The se
11320 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f  tup-query runs o
11330 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  nce to generate 
11340 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f  an initial set o
11350 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a  f rows that go.*
11360 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74  * into a Queue t
11370 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20  able.  Rows are 
11380 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
11390 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f  he Queue table o
113a0 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45  ne by.** one.  E
113b0 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65  ach row extracte
113c0 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20  d from Queue is 
113d0 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
113e0 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c    Then the singl
113f0 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72  e.** extracted r
11400 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69  ow (now in the i
11410 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62  Current table) b
11420 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65  ecomes the conte
11430 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63  nt of the.** rec
11440 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72  ursive-table for
11450 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65   a recursive-que
11460 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74  ry run.  The out
11470 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72  put of the recur
11480 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73  sive-query.** is
11490 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f   added back into
114a0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
114b0 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20  .  Then another 
114c0 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64  row is extracted
114d0 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61   from Queue.** a
114e0 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  nd the iteration
114f0 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c   continues until
11500 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11510 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
11520 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   If the compound
11530 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20   query operator 
11540 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f  is UNION then no
11550 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
11560 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65  are ever.** inse
11570 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75  rted into the Qu
11580 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  eue table.  The 
11590 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20  iDistinct table 
115a0 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20  keeps a copy of 
115b0 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74  all rows.** that
115c0 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20   have ever been 
115d0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75  inserted into Qu
115e0 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64  eue and causes d
115f0 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a  uplicates to be.
11600 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  ** discarded.  I
11610 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69  f the operator i
11620 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65  s UNION ALL, the
11630 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65  n duplicates are
11640 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a   allowed..** .**
11650 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61   If the query ha
11660 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  s an ORDER BY, t
11670 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74  hen entries in t
11680 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61  he Queue table a
11690 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52  re kept in.** OR
116a0 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64  DER BY order and
116b0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
116c0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f   is extracted fo
116d0 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57  r each cycle.  W
116e0 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44  ithout.** an ORD
116f0 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65  ER BY, the Queue
11700 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61   table is just a
11710 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FIFO..**.** If 
11720 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69  a LIMIT clause i
11730 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e  s provided, then
11740 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73   the iteration s
11750 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54  tops after LIMIT
11760 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65   rows.** have be
11770 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  en output to pDe
11780 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20  st.  A LIMIT of 
11790 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75  zero means to ou
117a0 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64  tput no rows and
117b0 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c   a.** negative L
117c0 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75  IMIT means to ou
117d0 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20  tput all rows.  
117e0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f  If there is also
117f0 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
11800 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69  e.** with a posi
11810 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e  tive value, then
11820 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
11830 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69  T outputs are di
11840 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a  scarded rather.*
11850 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e  * than being sen
11860 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65  t to pDest.  The
11870 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65   LIMIT count doe
11880 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69  s not begin unti
11890 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a  l after OFFSET.*
118a0 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  * rows have been
118b0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
118c0 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
118d0 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
118e0 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
118f0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
11900 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
11910 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
11920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11930 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
11940 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  CT to be coded *
11950 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
11960 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
11970 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
11980 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
11990 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
119a0 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20   = p->pSrc;     
119b0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
119c0 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72  use of the recur
119d0 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
119e0 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45  int nCol = p->pE
119f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a  List->nExpr;  /*
11a00 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
11a10 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  ns in the recurs
11a20 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56  ive table */.  V
11a30 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
11a40 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
11a50 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
11a60 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
11a70 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  struction */.  S
11a80 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20  elect *pSetup = 
11a90 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20  p->pPrior;   /* 
11aa0 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20  The setup query 
11ab0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
11ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11ad0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
11ae0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
11af0 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
11b00 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54  ak;      /* CONT
11b10 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61  INUE and BREAK a
11b20 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e  ddresses */.  in
11b30 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
11b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11b50 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
11b60 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72   */.  int regCur
11b70 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
11b80 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
11b90 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20  holding Current 
11ba0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
11bb0 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20  Queue;          
11bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11bd0 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
11be0 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d   int iDistinct =
11bf0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
11c00 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71  * To ensure uniq
11c10 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e  ue results if UN
11c20 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ION */.  int eDe
11c30 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20  st = SRT_Fifo;  
11c40 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
11c50 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20   write to Queue 
11c60 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
11c70 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20  destQueue;      
11c80 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74     /* SelectDest
11c90 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20   targetting the 
11ca0 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
11cb0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11cd0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11ce0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
11d10 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11d20 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
11d30 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
11d40 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
11d50 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
11d60 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  Offset;       /*
11d70 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64   Saved LIMIT and
11d80 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74   OFFSET */.  int
11d90 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66   regLimit, regOf
11da0 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65  fset;      /* Re
11db0 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20  gisters used by 
11dc0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11dd0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
11de0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
11df0 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65  o do a recursive
11e00 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
11e10 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
11e20 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
11e30 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c  RECURSIVE, 0, 0,
11e40 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
11e50 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
11e60 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11e70 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65   clauses, if the
11e80 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64  y exist */.  add
11e90 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
11ea0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11eb0 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ;.  p->nSelectRo
11ec0 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62  w = 320;  /* 4 b
11ed0 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20  illion rows */. 
11ee0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
11ef0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
11f00 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
11f10 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
11f20 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20  it;.  pOffset = 
11f30 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65  p->pOffset;.  re
11f40 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  gLimit = p->iLim
11f50 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20  it;.  regOffset 
11f60 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
11f70 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  p->pLimit = p->p
11f80 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d  Offset = 0;.  p-
11f90 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66  >iLimit = p->iOf
11fa0 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64  fset = 0;.  pOrd
11fb0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
11fc0 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65  By;..  /* Locate
11fd0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
11fe0 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e  er of the Curren
11ff0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  t table */.  for
12000 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
12010 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29  Src->nSrc); i++)
12020 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  {.    if( pSrc->
12030 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  a[i].fg.isRecurs
12040 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75  ive ){.      iCu
12050 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  rrent = pSrc->a[
12060 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  i].iCursor;.    
12070 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
12080 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
12090 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72  e cursors number
120a0 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20  s for Queue and 
120b0 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63  Distinct.  The c
120c0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
120d0 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e  .  ** the Distin
120e0 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ct table must be
120f0 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65   exactly one gre
12100 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20  ater than Queue 
12110 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f  in order.  ** fo
12120 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69  r the SRT_DistFi
12130 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51  fo and SRT_DistQ
12140 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  ueue destination
12150 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20  s to work. */.  
12160 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d  iQueue = pParse-
12170 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70  >nTab++;.  if( p
12180 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
12190 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
121a0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73  rderBy ? SRT_Dis
121b0 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73  tQueue : SRT_Dis
121c0 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74  tFifo;.    iDist
121d0 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
121e0 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tab++;.  }else{.
121f0 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
12200 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65  erBy ? SRT_Queue
12210 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d   : SRT_Fifo;.  }
12220 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
12230 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
12240 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
12250 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
12260 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
12270 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
12280 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
12290 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
122a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
122b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
122c0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
122d0 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
122e0 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
122f0 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
12300 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
12310 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
12320 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
12330 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
12340 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
12350 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
12360 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
12370 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
12380 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123a0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
123b0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
123c0 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
123d0 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
123e0 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
123f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12400 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
12410 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
12420 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
12430 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
12440 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
12450 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
12460 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
12470 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
12480 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12490 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
124a0 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
124b0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
124c0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
124d0 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
124e0 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
124f0 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
12500 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
12510 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
12520 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
12530 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
12540 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
12550 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
12560 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
12570 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  xt = 0;.  rc = s
12580 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
12590 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65  rse, pSetup, &de
125a0 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74  stQueue);.  pSet
125b0 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  up->pNext = p;. 
125c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
125d0 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
125e0 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
125f0 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
12600 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
12610 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
12620 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
12630 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12640 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
12650 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
12660 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
12670 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66  v);..  /* Transf
12680 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  er the next row 
12690 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f  in Queue over to
126a0 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71   Current */.  sq
126b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
126c0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69  v, OP_NullRow, i
126d0 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20  Current); /* To 
126e0 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63  reset column cac
126f0 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  he */.  if( pOrd
12700 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
12710 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12720 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65   OP_Column, iQue
12730 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
12740 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e  xpr+1, regCurren
12750 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
12760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12770 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
12780 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72  , iQueue, regCur
12790 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rent);.  }.  sql
127a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
127b0 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
127c0 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  eue);..  /* Outp
127d0 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ut the single ro
127e0 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a  w in Current */.
127f0 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c    addrCont = sql
12800 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
12810 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  l(v);.  codeOffs
12820 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c  et(v, regOffset,
12830 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65   addrCont);.  se
12840 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
12850 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
12860 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20  st, iCurrent,.  
12870 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
12880 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
12890 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
128a0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
128b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
128c0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
128d0 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
128e0 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
128f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12900 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
12910 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
12920 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
12930 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
12940 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
12950 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
12960 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
12970 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
12980 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
12990 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
129a0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
129b0 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
129c0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
129d0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
129e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
129f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
12a00 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61  ecursive aggrega
12a10 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73  te queries not s
12a20 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65  upported");.  }e
12a30 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  lse{.    p->pPri
12a40 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  or = 0;.    sqli
12a50 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
12a60 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  , p, &destQueue)
12a70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
12a80 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
12a90 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53    p->pPrior = pS
12aa0 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  etup;.  }..  /* 
12ab0 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65  Keep running the
12ac0 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20   loop until the 
12ad0 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a  Queue is empty *
12ae0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  /.  sqlite3VdbeG
12af0 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  oto(v, addrTop);
12b00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
12b10 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
12b20 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f  drBreak);..end_o
12b30 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
12b40 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  y:.  sqlite3Expr
12b50 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
12b60 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
12b70 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72  By);.  p->pOrder
12b80 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
12b90 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
12ba0 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  mit;.  p->pOffse
12bb0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72  t = pOffset;.  r
12bc0 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
12bd0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
12be0 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  TE */../* Forwar
12bf0 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
12c00 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
12c10 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
12c20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12c30 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12c40 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
12c50 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12c60 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
12c70 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
12c80 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
12c90 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
12ca0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
12cb0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
12cc0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a  y results */.);.
12cd0 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68  ./*.** Handle th
12ce0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
12cf0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  f a compound-sel
12d00 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ect that origina
12d10 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41  tes from a.** VA
12d20 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79  LUES clause.  By
12d30 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61   handling this a
12d40 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
12d50 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a  , we avoid deep.
12d60 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e  ** recursion, an
12d70 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65  d thus do not ne
12d80 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ed to enforce th
12d90 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  e SQLITE_LIMIT_C
12da0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a  OMPOUND_SELECT.*
12db0 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c  * on a VALUES cl
12dc0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61  ause..**.** Beca
12dd0 75 73 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f  use the Select o
12de0 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73  bject originates
12df0 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63   from a VALUES c
12e00 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20  lause:.**   (1) 
12e10 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d 49 54 20  It has no LIMIT 
12e20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20 20 20 28  or OFFSET.**   (
12e30 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65  2) All terms are
12e40 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20   UNION ALL.**   
12e50 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20  (3) There is no 
12e60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
12e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
12e80 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
12e90 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12ea0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
12eb0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
12ec0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
12ed0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
12ee0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
12ef0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
12f00 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12f10 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
12f20 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
12f30 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
12f40 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  {.  Select *pPri
12f50 6f 72 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d  or;.  int nRow =
12f60 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   1;.  int rc = 0
12f70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
12f80 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
12f90 74 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b  tiValue );.  do{
12fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12fb0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
12fc0 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65  lues );.    asse
12fd0 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  rt( p->op==TK_AL
12fe0 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f  L || (p->op==TK_
12ff0 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72  SELECT && p->pPr
13000 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  ior==0) );.    a
13010 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
13020 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
13030 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
13040 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13050 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  p->pNext==0 || p
13060 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
13070 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73  =p->pNext->pELis
13080 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
13090 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  if( p->pPrior==0
130a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
130b0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d  sert( p->pPrior-
130c0 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20  >pNext==p );.   
130d0 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
130e0 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77      nRow++;.  }w
130f0 68 69 6c 65 28 31 29 3b 0a 20 20 77 68 69 6c 65  hile(1);.  while
13100 28 20 70 20 29 7b 0a 20 20 20 20 70 50 72 69 6f  ( p ){.    pPrio
13110 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
13120 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
13130 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13140 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13150 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
13160 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
13170 6f 72 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  or;.    if( rc )
13180 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e   break;.    p->n
13190 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77  SelectRow = nRow
131a0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  ;.    p = p->pNe
131b0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
131c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
131d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
131e0 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
131f0 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
13200 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77   form from.** tw
13210 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
13220 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67  te queries using
13230 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c   UNION, UNION AL
13240 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a  L, EXCEPT, or.**
13250 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a   INTERSECT.**.**
13260 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
13270 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
13280 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
13290 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
132a0 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
132b0 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
132c0 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
132d0 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
132e0 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
132f0 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
13300 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
13310 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
13320 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
13330 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
13340 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
13350 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
13360 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
13370 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
13380 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
13390 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
133a0 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
133b0 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
133c0 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
133d0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
133e0 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
133f0 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
13400 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
13410 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
13420 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
13430 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
13440 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
13450 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
13460 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
13470 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
13480 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
13490 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
134a0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
134b0 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
134c0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
134d0 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
134e0 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
134f0 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
13500 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
13510 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
13520 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
13530 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
13540 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
13550 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
13560 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
13570 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
13580 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
13590 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
135a0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
135b0 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
135c0 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
135d0 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
135e0 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
135f0 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
13600 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
13610 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
13620 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
13630 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
13640 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13650 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
13660 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
13670 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
13680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
13690 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
136a0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
136b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
136c0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
136d0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
136e0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
136f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13700 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
13710 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
13720 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
13730 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
13740 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
13750 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
13760 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
13770 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13790 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
137a0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
137b0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
137c0 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
137d0 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e  tive data destin
137e0 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ation */.  Selec
137f0 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
13800 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d   /* Chain of sim
13810 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64  ple selects to d
13820 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  elete */.  sqlit
13830 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
13840 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
13850 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64  nection */.#ifnd
13860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
13870 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
13880 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  b1 = 0;        /
13890 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
138a0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
138b0 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20   int iSub2 = 0; 
138c0 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
138d0 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
138e0 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
138f0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
13900 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
13910 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
13920 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
13930 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
13940 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
13950 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
13960 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
13970 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
13980 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
13990 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
139a0 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20  ->pPrior );  /* 
139b0 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  Calling function
139c0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
139d0 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72   much */.  asser
139e0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
139f0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
13a00 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  =0 || p->op==TK_
13a10 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ALL || p->op==TK
13a20 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d  _UNION );.  db =
13a30 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
13a40 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
13a50 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65  r;.  dest = *pDe
13a60 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  st;.  if( pPrior
13a70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
13a80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13a90 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
13aa0 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
13ab0 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
13ac0 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
13ad0 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
13ae0 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
13af0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
13b00 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13b10 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
13b20 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
13b30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13b40 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
13b50 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
13b60 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
13b70 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
13b80 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
13b90 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
13ba0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
13bb0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
13bc0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
13bd0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
13be0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
13bf0 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
13c00 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
13c10 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
13c20 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
13c30 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
13c40 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
13c50 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
13c60 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
13c70 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
13c80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13c90 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
13ca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13cb0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
13cc0 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50  meral, dest.iSDP
13cd0 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
13ce0 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
13cf0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
13d00 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
13d10 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
13d20 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
13d30 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
13d40 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
13d50 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
13d60 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
13d70 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
13d80 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
13d90 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
13da0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
13db0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
13dc0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
13dd0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
13de0 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
13df0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
13e00 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
13e10 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
13e20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
13e30 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
13e40 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13e50 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
13e60 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
13e70 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
13e80 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
13e90 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
13ea0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13eb0 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
13ec0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
13ed0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
13ee0 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
13ef0 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
13f00 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
13f10 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
13f20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
13f30 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
13f40 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
13f50 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
13f60 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
13f70 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
13f80 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
13f90 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
13fa0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
13fb0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47  .  }else..  /* G
13fc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
13fd0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
13fe0 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
13ff0 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
14000 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
14010 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
14020 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
14030 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
14040 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
14050 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
14060 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
14070 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
14080 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
14090 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
140a0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
140b0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
140c0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
140d0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
140e0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
140f0 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  set;.      expla
14100 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14110 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
14120 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14140 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14150 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
14160 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14170 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
14180 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
14190 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
141a0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
141b0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
141c0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
141d0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69   0;.      p->iLi
141e0 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
141f0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  imit;.      p->i
14200 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
14210 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
14220 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
14230 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
14240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14250 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70  1(v, OP_IfNot, p
14260 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  ->iLimit); VdbeC
14270 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14280 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
14290 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
142a0 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
142b0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  "));.        if(
142c0 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20   p->iOffset ){. 
142d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
142e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
142f0 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20 20  _OffsetLimit,.  
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14310 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69            p->iLi
14320 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b  mit, p->iOffset+
14330 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  1, p->iOffset);.
14340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14350 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  }.      explainS
14360 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
14370 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14380 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
14390 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
143a0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
143b0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
143c0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
143d0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
143e0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
143f0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14400 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
14410 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
14420 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
14430 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
14440 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
14450 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Row);.      if( 
14460 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20  pPrior->pLimit. 
14470 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
14480 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50  ExprIsInteger(pP
14490 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  rior->pLimit, &n
144a0 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26  Limit).       &&
144b0 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e   nLimit>0 && p->
144c0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c  nSelectRow > sql
144d0 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
144e0 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 29  nLimit) .      )
144f0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
14500 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
14510 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69  3LogEst((u64)nLi
14520 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
14530 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
14540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14550 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
14560 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
14570 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14580 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
14590 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
145a0 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
145b0 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
145c0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
145d0 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
145e0 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
145f0 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
14600 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
14610 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
14620 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
14630 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
14640 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
14650 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
14660 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
14670 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
14680 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
14690 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
146a0 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
146b0 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
146c0 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
146d0 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
146e0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
146f0 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
14700 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
14710 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
14720 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
14730 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
14740 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
14750 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
14760 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
14770 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
14780 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
14790 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
147a0 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
147b0 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
147c0 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
147d0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
147e0 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
147f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14800 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20  ->pLimit==0 );  
14810 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
14820 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
14830 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
14840 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
14850 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
14860 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
14870 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
14880 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
14890 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
148a0 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  SDParm;.      }e
148b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
148c0 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
148d0 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
148e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
148f0 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
14900 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
14910 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
14920 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
14930 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
14940 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
14950 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
14960 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
14970 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
14980 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14990 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
149a0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
149b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
149c0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
149d0 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
149e0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
149f0 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
14a00 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
14a10 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
14a20 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
14a30 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
14a40 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
14a50 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
14a60 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
14a70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
14a80 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
14a90 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
14aa0 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
14ab0 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
14ac0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14ad0 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
14ae0 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
14af0 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
14b00 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14b10 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
14b20 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14b30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14b40 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14b50 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
14b60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
14b70 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
14b80 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
14b90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14ba0 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
14bb0 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
14bc0 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
14bd0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
14be0 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
14bf0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
14c00 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
14c10 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
14c20 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
14c30 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
14c40 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
14c50 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
14c60 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
14c70 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
14c80 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
14c90 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
14ca0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
14cb0 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
14cc0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
14cd0 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
14ce0 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70   = op;.      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 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
14d50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14d60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
14d70 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
14d80 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
14d90 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
14da0 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
14db0 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
14dc0 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
14dd0 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
14de0 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
14df0 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
14e00 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
14e10 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
14e20 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
14e30 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
14e40 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
14e50 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14e60 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
14e70 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
14e80 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
14e90 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
14ea0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
14eb0 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
14ec0 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
14ed0 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
14ee0 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d  ectRow);.      }
14ef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14f00 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
14f10 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
14f20 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
14f30 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
14f40 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
14f50 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
14f60 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
14f70 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
14f80 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
14f90 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
14fa0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
14fb0 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
14fc0 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
14fd0 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
14fe0 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
14ff0 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
15000 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
15010 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
15020 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
15030 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
15040 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st!=priorOp ){. 
15050 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
15060 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
15070 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15080 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
15090 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
150a0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
150b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  t ){.          S
150c0 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
150d0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
150e0 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
150f0 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
15100 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
15110 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
15120 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
15130 73 65 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63  se, pFirst->pSrc
15140 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
15150 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15160 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
15170 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15180 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
15190 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
151a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
151b0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
151c0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
151d0 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
151e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
151f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15200 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
15210 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
15220 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15230 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
15240 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15250 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
15260 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
15270 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
15280 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
15290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
152a0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
152b0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
152c0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
152d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
152e0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
152f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15300 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15310 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
15320 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
15330 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15350 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
15360 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
15370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15380 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
15390 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
153a0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
153b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
153c0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
153d0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
153e0 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
153f0 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
15400 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
15410 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
15420 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
15430 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
15440 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
15450 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
15460 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
15470 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
15480 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
15490 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
154a0 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
154b0 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
154c0 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
154d0 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
154e0 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
154f0 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
15500 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
15510 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
15520 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
15530 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
15540 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
15550 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
15560 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
15570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15580 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
15590 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
155a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
155b0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
155c0 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
155d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
155e0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
155f0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
15600 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15610 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
15620 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
15630 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
15640 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
15650 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15660 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
15670 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
15680 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
15690 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
156a0 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
156b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
156c0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
156d0 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
156e0 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
156f0 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
15700 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
15710 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
15720 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
15730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15740 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
15750 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
15760 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
15770 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
15780 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
15790 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
157a0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
157b0 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
157c0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
157d0 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
157e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
157f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15800 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
15810 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
15820 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
15830 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
15840 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
15850 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
15860 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
15870 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
15880 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
15890 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
158a0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
158b0 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
158c0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
158d0 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
158e0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
158f0 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d  sectdest.iSDParm
15900 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
15910 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
15920 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
15930 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
15940 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15950 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
15960 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
15970 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
15980 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
15990 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
159a0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
159b0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
159c0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
159d0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
159e0 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
159f0 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
15a00 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
15a10 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
15a20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
15a30 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
15a40 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
15a50 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
15a60 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
15a70 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
15a80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
15a90 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
15aa0 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
15ab0 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
15ac0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
15ad0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15ae0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15af0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
15b00 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
15b10 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
15b20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
15b30 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
15b40 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
15b50 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
15b60 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
15b70 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
15b80 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
15b90 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20  , pFirst->pSrc, 
15ba0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
15bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15bc0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
15bd0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15be0 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
15bf0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15c00 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
15c10 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
15c20 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
15c30 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
15c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15c50 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
15c60 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  b1, iBreak); Vdb
15c70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15c80 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15c90 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
15ca0 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
15cb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15cc0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
15cd0 74 61 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20  ta, tab1, r1);. 
15ce0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15cf0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
15d00 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
15d10 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56  iCont, r1, 0); V
15d20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15d40 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15d50 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
15d60 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
15d70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
15d80 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  ist, tab1,.     
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
15db0 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
15dc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15dd0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
15de0 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
15df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15e00 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
15e10 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
15e20 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
15e30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15e40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
15e50 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
15e60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15e70 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
15e80 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
15e90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15ea0 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
15eb0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15ec0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70      }.  }..  exp
15ed0 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
15ee0 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
15ef0 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70  b1, iSub2, p->op
15f00 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a  !=TK_ALL);..  /*
15f10 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69   Compute collati
15f20 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
15f30 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  d by .  ** tempo
15f40 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64  rary tables need
15f50 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
15f60 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
15f70 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68  ect..  ** Attach
15f80 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
15f90 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65  ucture to all te
15fa0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a  mporary tables..
15fb0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
15fc0 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79  ection is run by
15fd0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
15fe0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15ff0 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45   only..  ** SELE
16000 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
16010 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73   the left always
16020 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e   skip this part.
16030 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
16040 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67  .  ** SELECT mig
16050 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69  ht also skip thi
16060 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73  s part if it has
16070 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
16080 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20  use and.  ** no 
16090 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20  temp tables are 
160a0 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
160b0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
160c0 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65   & SF_UsesEpheme
160d0 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ral ){.    int i
160e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
160f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
16100 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
16110 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16120 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
16130 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
16140 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
16150 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
16160 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
16170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16180 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
16190 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
161a0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
161b0 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20  Seq **apColl;   
161c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
161d0 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
161e0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
161f0 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  [] */.    int nC
16200 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
16210 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16220 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
16230 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
16240 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
16250 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43  ext==0 );.    nC
16260 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
16270 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
16280 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
16290 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43  InfoAlloc(db, nC
162a0 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ol, 1);.    if( 
162b0 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
162c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
162d0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
162e0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
162f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
16300 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
16310 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
16320 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
16330 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
16340 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
16350 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
16360 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
16370 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
16380 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
16390 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
163a0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
163b0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
163c0 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
163d0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
163e0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
163f0 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
16400 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
16410 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
16420 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
16430 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
16440 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
16450 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
16460 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
16470 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
16480 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
16490 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
164a0 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
164b0 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
164c0 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
164d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
164e0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
164f0 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
16500 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
16520 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16530 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
16540 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16550 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
16560 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73  , addr, (char*)s
16570 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
16580 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20  (pKeyInfo),.    
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
165b0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
165c0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
165d0 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
165e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
165f0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
16600 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
16610 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
16620 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74  :.  pDest->iSdst
16630 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
16640 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
16650 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71  dest.nSdst;.  sq
16660 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
16670 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
16680 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
16690 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
166a0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
166b0 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  LECT */../*.** E
166c0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
166d0 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72   when two or mor
166e0 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d  e terms of a com
166f0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76  pound select hav
16700 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73  e different.** s
16710 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e  ize result sets.
16720 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16730 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  SelectWrongNumTe
16740 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a  rmsError(Parse *
16750 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
16760 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  p){.  if( p->sel
16770 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
16780 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
16790 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
167a0 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
167b0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
167c0 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
167d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
167e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
167f0 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
16800 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
16810 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
16820 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
16830 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16840 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
16850 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
16860 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
16870 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
16880 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
16890 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
168a0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
168b0 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
168c0 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
168d0 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
168e0 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
168f0 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
16900 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
16910 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
16920 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
16930 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
16940 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
16950 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
16960 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
16970 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
16980 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
16990 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
169a0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
169b0 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
169c0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
169d0 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
169e0 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
169f0 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
16a00 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
16a10 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
16a20 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
16a30 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
16a40 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
16a50 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
16a60 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
16a70 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
16a80 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
16a90 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
16aa0 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
16ab0 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
16ac0 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
16ad0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
16ae0 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
16af0 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
16b00 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
16b10 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
16b20 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
16b30 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
16b40 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
16b50 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16b60 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
16b70 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
16b80 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
16b90 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
16ba0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
16bb0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
16bc0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
16bd0 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
16be0 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
16bf0 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
16c00 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
16c10 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
16c20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
16c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16c40 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
16c50 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
16c60 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
16c70 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
16c80 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
16c90 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
16ca0 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
16cb0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
16cc0 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
16cd0 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
16ce0 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
16cf0 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
16d00 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
16d10 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
16d20 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
16d30 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
16d40 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
16d50 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
16d60 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
16d70 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16d80 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
16d90 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
16da0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16db0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
16dc0 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
16dd0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
16de0 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
16df0 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
16e00 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
16e10 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64  , addr2;.    add
16e20 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
16e30 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
16e40 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
16e50 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16e60 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
16e70 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16e80 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
16e90 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
16ea0 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20  1, pIn->nSdst,. 
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16ed0 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
16ee0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
16ef0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16f10 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
16f20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  addr2+2, iContin
16f30 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64  ue, addr2+2); Vd
16f40 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16f60 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
16f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16f80 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
16f90 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
16fa0 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
16fb0 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
16fc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16fd0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
16fe0 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
16ff0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
17000 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17010 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
17020 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
17030 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
17040 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
17050 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
17060 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
17070 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
17080 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
17090 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
170a0 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
170b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
170c0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
170d0 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63  Table );.  switc
170e0 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
170f0 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
17100 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
17110 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
17120 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
17130 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
17140 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
17150 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
17160 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17170 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
17180 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17190 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
171a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
171b0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
171c0 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
171d0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
171e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
171f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17200 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
17210 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
17220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17230 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
17240 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
17250 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
17260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
17270 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
17280 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
17290 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
172a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
172b0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
172c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
172d0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
172e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
172f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17300 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
17310 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
17320 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
17330 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
17340 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20  ELECT ...)"..   
17350 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
17360 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
17370 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74  t r1;.      test
17380 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
17390 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  >1 );.      r1 =
173a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
173b0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
173c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
173d0 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
173e0 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
173f0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20  , pIn->nSdst, . 
17400 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65           r1, pDe
17410 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49  st->zAffSdst, pI
17420 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17430 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17440 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
17450 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17460 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
17470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17480 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
17490 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
174a0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
174b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
174c0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d              pIn-
174d0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
174e0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
174f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17500 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
17510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17520 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
17530 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
17540 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
17550 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
17560 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
17570 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
17580 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
17590 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
175a0 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
175b0 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
175c0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
175d0 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
175e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
175f0 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c  pIn->nSdst==1 ||
17600 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
17610 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49  );  testcase( pI
17620 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20  n->nSdst!=1 );. 
17630 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17640 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
17650 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
17660 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b  st->iSDParm, 1);
17670 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
17680 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
17690 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
176a0 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
176b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
176c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
176d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
176e0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
176f0 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
17700 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
17710 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
17720 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
17730 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
17740 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
17750 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
17760 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
17770 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
17780 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
17790 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
177a0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
177b0 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
177c0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
177d0 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
177e0 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
177f0 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
17800 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
17810 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17820 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
17830 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
17840 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17850 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
17860 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17870 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
17880 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
17890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
178a0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
178b0 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
178c0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
178d0 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
178e0 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
178f0 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
17900 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
17910 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
17920 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
17930 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
17940 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
17950 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
17960 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
17970 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
17980 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
17990 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
179a0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
179b0 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
179c0 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
179d0 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
179e0 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
179f0 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
17a00 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
17a10 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
17a20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
17a30 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
17a40 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
17a50 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
17a60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17a70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17a80 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
17a90 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17aa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17ab0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
17ac0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
17ad0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
17ae0 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62  >nSdst);.      b
17af0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
17b00 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
17b10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
17b20 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
17b30 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
17b40 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
17b50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
17b60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
17b70 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e  ecrJumpZero, p->
17b80 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
17b90 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17ba0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
17bb0 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74  rate the subrout
17bc0 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  ine return.  */.
17bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17be0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
17bf0 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74  ntinue);.  sqlit
17c00 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17c10 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
17c20 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e  turn);..  return
17c30 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
17c40 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70  Alternative comp
17c50 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65  ound select code
17c60 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63   generator for c
17c70 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a  ases when there.
17c80 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  ** is an ORDER B
17c90 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
17ca0 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72  We assume a quer
17cb0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
17cc0 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
17cd0 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c      <selectA>  <
17ce0 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65  operator>  <sele
17cf0 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c  ctB>  ORDER BY <
17d00 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a  orderbylist>.**.
17d10 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
17d20 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c   one of UNION AL
17d30 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  L, UNION, EXCEPT
17d40 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20  , or INTERSECT. 
17d50 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20   The idea.** is 
17d60 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65  to code both <se
17d70 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65  lectA> and <sele
17d80 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52  ctB> with the OR
17d90 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
17da0 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e  .** co-routines.
17db0 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63    Then run the c
17dc0 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61  o-routines in pa
17dd0 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65  rallel and merge
17de0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
17df0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  into the output.
17e00 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
17e10 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
17e20 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65  nes (called sele
17e30 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63  ctA and.** selec
17e40 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20  tB) there are 7 
17e50 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a  subroutines:.**.
17e60 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d  **    outA:    M
17e70 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
17e80 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f  f the selectA co
17e90 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
17ea0 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
17eb0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
17ec0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a  mpound query..**
17ed0 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20  .**    outB:    
17ee0 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
17ef0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63  of the selectB c
17f00 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
17f10 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
17f20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
17f30 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20  ompound query.  
17f40 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20  (Only generated 
17f50 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a  for UNION and.**
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
17f70 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20  ON ALL.  EXCEPT 
17f80 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e  and INSERTSECT n
17f90 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f  ever output a ro
17fa0 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  w that.**       
17fb0 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e        appears on
17fc0 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20  ly in B.).**.** 
17fd0 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c     AltB:    Call
17fe0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
17ff0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
18000 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
18010 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71  <B..**.**    Aeq
18020 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
18030 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
18040 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
18050 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a  ines and A==B..*
18060 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20  *.**    AgtB:   
18070 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
18080 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
18090 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
180a0 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A>B..**.**  
180b0 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65    EofA:    Calle
180c0 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
180d0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
180e0 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lectA..**.**    
180f0 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofB:    Called 
18100 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
18110 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
18120 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ctB..**.** The i
18130 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
18140 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65   the latter five
18150 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70   subroutines dep
18160 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a  end on which .**
18170 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75   <operator> is u
18180 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20  sed:.**.**.**   
18190 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
181a0 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f  ALL         UNIO
181b0 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43  N            EXC
181c0 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54  EPT          INT
181d0 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  ERSECT.**       
181e0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
181f0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
18200 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
18210 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
18220 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42  ------.**   AltB
18230 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
18240 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
18250 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
18260 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
18270 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20  .**.**   AeqB:  
18280 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
18290 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
182a0 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
182b0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
182c0 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20  .**.**   AgtB:  
182d0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
182e0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
182f0 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20         nextB    
18300 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a          nextB.**
18310 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75  .**   EofA:   ou
18320 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
18330 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
18340 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20      halt        
18350 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
18360 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20    EofB:   outA, 
18370 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
18380 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
18390 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
183a0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   halt.**.** In t
183b0 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61  he AltB, AeqB, a
183c0 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69  nd AgtB subrouti
183d0 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41  nes, an EOF on A
183e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41   following nextA
183f0 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d  .** causes an im
18400 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
18410 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20  EofA and an EOF 
18420 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on B following n
18430 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61  extB causes.** a
18440 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
18450 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69   to EofB.  Withi
18460 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c  n EofA and EofB,
18470 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72   and EOF on entr
18480 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  y or.** followin
18490 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61  g nextX causes a
184a0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   jump to the end
184b0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70   of the select p
184c0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
184d0 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   Duplicate remov
184e0 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c  al in the UNION,
184f0 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
18500 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20  ERSECT cases is 
18510 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69  handled.** withi
18520 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  n the output sub
18530 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65  routine.  The re
18540 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73  gPrev register s
18550 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65  et holds the pre
18560 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75  viously.** outpu
18570 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70  t value.  A comp
18580 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61  arison is made a
18590 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75  gainst this valu
185a0 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  e and the output
185b0 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69  .** is skipped i
185c0 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  f the next resul
185d0 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20  ts would be the 
185e0 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76  same as the prev
185f0 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ious..**.** The 
18600 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
18610 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d  lan is to implem
18620 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f  ent the two coro
18630 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e  utines and seven
18640 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20  .** subroutines 
18650 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20  first, then put 
18660 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69  the control logi
18670 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e  c at the bottom.
18680 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
18690 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  **          goto
186a0 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41   Init.**     coA
186b0 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
186c0 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a  left query (A).*
186d0 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75  *     coB: corou
186e0 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71  tine for right q
186f0 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f  uery (B).**    o
18700 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utA: output one 
18710 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f  row of A.**    o
18720 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utB: output one 
18730 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20  row of B (UNION 
18740 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e  and UNION ALL on
18750 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  ly).**    EofA: 
18760 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  ....**    EofB: 
18770 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  ....**    AltB: 
18780 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  ....**    AeqB: 
18790 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  ....**    AgtB: 
187a0 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20  ....**    Init: 
187b0 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75  initialize corou
187c0 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tine registers.*
187d0 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
187e0 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20   coA.**         
187f0 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20   if eof(A) goto 
18800 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  EofA.**         
18810 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20   yield coB.**   
18820 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29         if eof(B)
18830 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20   goto EofB.**   
18840 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41   Cmpr: Compare A
18850 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  , B.**          
18860 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c  Jump AltB, AeqB,
18870 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64   AgtB.**     End
18880 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63  : ....**.** We c
18890 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  all AltB, AeqB, 
188a0 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20  AgtB, EofA, and 
188b0 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65  EofB "subroutine
188c0 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20  s" but they are 
188d0 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20  not.** actually 
188e0 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73  called using Gos
188f0 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e  ub and they do n
18900 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41  ot Return.  EofA
18910 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a   and EofB loop.*
18920 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61  * until all data
18930 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68   is exhausted th
18940 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22  en jump to the "
18950 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42  end" labe.  AltB
18960 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41  , AeqB,.** and A
18970 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68  gtB jump to eith
18980 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20  er L2 or to one 
18990 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e  of EofA or EofB.
189a0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
189b0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
189c0 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69  _SELECT.static i
189d0 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
189e0 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
189f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
18a00 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
18a10 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
18a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18a30 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
18a40 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
18a50 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
18a60 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
18a70 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
18a80 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
18a90 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
18aa0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
18ab0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
18ac0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
18ad0 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
18ae0 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
18af0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
18b00 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
18b10 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
18b20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
18b30 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
18b40 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
18b50 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73  estA;     /* Des
18b60 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
18b70 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65  outine A */.  Se
18b80 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20  lectDest destB; 
18b90 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
18ba0 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
18bb0 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41   B */.  int regA
18bc0 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrA;         /*
18bd0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
18be0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63  r for select-A c
18bf0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
18c00 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
18c10 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
18c20 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
18c30 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
18c40 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
18c50 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
18c60 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
18c70 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
18c80 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
18c90 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
18ca0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
18cb0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
18cc0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
18cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
18ce0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18cf0 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
18d00 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18d10 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
18d20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18d30 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
18d40 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
18d50 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18d60 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
18d70 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18d80 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
18d90 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18da0 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20  ddrOutB = 0;    
18db0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18dc0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
18dd0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18de0 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
18df0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18e00 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
18e10 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
18e20 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
18e30 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20  ofA_noB;     /* 
18e40 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f  Alternate addrEo
18e50 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69  fA if B is unini
18e60 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e  tialized */.  in
18e70 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20  t addrEofB;     
18e80 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18e90 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65  f the select-B-e
18ea0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
18eb0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18ec0 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAltB;         /
18ed0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18ee0 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A<B subroutine 
18ef0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71  */.  int addrAeq
18f00 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18f10 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d  dress of the A==
18f20 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
18f30 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20    int addrAgtB; 
18f40 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18f50 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75  ss of the A>B su
18f60 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18f70 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20  t regLimitA;    
18f80 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
18f90 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
18fa0 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  -A */.  int regL
18fb0 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a  imitB;        /*
18fc0 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
18fd0 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
18fe0 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
18ff0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e          /* A ran
19000 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
19010 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73  to hold previous
19020 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
19030 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20   savedLimit;    
19040 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
19050 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  e of p->iLimit *
19060 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66  /.  int savedOff
19070 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76  set;      /* Sav
19080 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
19090 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  Offset */.  int 
190a0 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20  labelCmpr;      
190b0 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
190c0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
190d0 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
190e0 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e  */.  int labelEn
190f0 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  d;         /* La
19100 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20  bel for the end 
19110 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53  of the overall S
19120 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20  ELECT stmt */.  
19130 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
19140 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e        /* Jump in
19150 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
19160 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20  get retargetted 
19170 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
19180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
19190 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f  e of TK_ALL, TK_
191a0 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
191b0 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a  , TK_INTERSECT *
191c0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
191d0 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d  yDup = 0; /* Com
191e0 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
191f0 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
19200 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b  e removal */.  K
19210 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67  eyInfo *pKeyMerg
19220 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  e;   /* Comparis
19230 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
19240 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20  or merging rows 
19250 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
19260 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
19270 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19280 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
19290 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
192a0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
192b0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  use */.  int nOr
192c0 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
192d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
192e0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
192f0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
19300 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20  t *aPermute;    
19310 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
19320 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72  rom ORDER BY ter
19330 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74  ms to result set
19340 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e   columns */.#ifn
19350 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19360 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53  EXPLAIN.  int iS
19370 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub1;            
19380 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66  /* EQP id of lef
19390 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
193a0 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20    int iSub2;    
193b0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
193c0 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  d of right-hand 
193d0 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  query */.#endif.
193e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
193f0 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
19400 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d  ssert( pKeyDup==
19410 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64  0 ); /* "Managed
19420 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69  " code needs thi
19430 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32  s.  Ticket #3382
19440 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  . */.  db = pPar
19450 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50  se->db;.  v = pP
19460 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
19470 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
19480 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20       /* Already 
19490 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72  thrown the error
194a0 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66   if VDBE alloc f
194b0 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c  ailed */.  label
194c0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
194d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
194e0 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c   labelCmpr = sql
194f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
19500 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  l(v);...  /* Pat
19510 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
19520 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
19530 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
19540 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
19550 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
19560 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
19570 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
19580 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
19590 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
195a0 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
195b0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
195c0 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
195d0 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
195e0 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
195f0 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
19600 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
19610 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
19620 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
19630 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
19640 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
19650 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
19660 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
19670 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
19680 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
19690 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
196a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
196b0 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
196c0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
196d0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
196e0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
196f0 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
19700 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
19710 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
19720 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
19730 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
19740 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
19750 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
19760 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
19770 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19780 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
19790 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
197a0 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
197b0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
197c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
197d0 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
197e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
197f0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
19800 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
19810 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
19820 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
19830 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
19840 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
19850 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
19860 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
19870 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
19880 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
19890 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
198a0 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
198b0 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
198c0 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
198d0 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
198e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
198f0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
19900 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
19910 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
19920 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
19930 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
19940 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
19950 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
19960 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
19970 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
19980 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
19990 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
199a0 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
199b0 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
199c0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
199d0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
199e0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
199f0 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
19a00 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
19a10 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
19a20 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
19a30 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
19a40 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
19a50 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
19a60 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
19a70 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
19a80 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31  t)*(nOrderBy + 1
19a90 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  ));.  if( aPermu
19aa0 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
19ab0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19ac0 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d  pItem;.    aPerm
19ad0 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42  ute[0] = nOrderB
19ae0 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  y;.    for(i=1, 
19af0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
19b00 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20  a; i<=nOrderBy; 
19b10 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
19b20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
19b30 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
19b40 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  Col>0 );.      a
19b50 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
19b60 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
19b70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
19b80 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
19b90 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
19ba0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
19bb0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
19bc0 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
19bd0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
19be0 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
19bf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19c00 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
19c10 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
19c20 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19c30 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
19c40 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
19c50 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
19c60 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
19c70 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
19c80 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
19c90 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
19ca0 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
19cb0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
19cc0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
19cd0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
19ce0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
19cf0 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
19d00 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
19d10 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
19d20 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
19d30 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
19d40 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
19d50 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
19d60 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
19d70 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
19d80 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
19d90 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
19da0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
19db0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
19dc0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
19dd0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
19de0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19df0 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
19e00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
19e10 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
19e20 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
19e30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19e40 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
19e50 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
19e60 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
19e70 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
19e80 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
19e90 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
19ea0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19eb0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
19ec0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
19ed0 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
19ee0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
19ef0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
19f00 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
19f10 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
19f20 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
19f30 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
19f40 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
19f50 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
19f60 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
19f70 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
19f80 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
19f90 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
19fa0 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
19fb0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
19fc0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
19fd0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
19fe0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
19ff0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
1a000 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1a010 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
1a020 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
1a030 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1a040 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1a050 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
1a060 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
1a070 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
1a080 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
1a090 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
1a0a0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1a0b0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1a0c0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1a0d0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
1a0e0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1a0f0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
1a100 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a110 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
1a120 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a140 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1a150 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
1a160 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
1a170 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a190 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
1a1a0 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
1a1b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a1c0 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
1a1d0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
1a1e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
1a1f0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
1a200 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
1a210 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1a220 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
1a230 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1a240 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1a250 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
1a260 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
1a270 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
1a280 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
1a290 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
1a2a0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a2b0 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
1a2c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a2d0 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
1a2e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
1a2f0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1a300 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
1a310 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1a320 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
1a330 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1a340 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
1a350 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
1a360 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
1a370 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
1a380 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
1a390 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
1a3a0 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
1a3b0 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
1a3c0 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
1a3d0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  lect..  */.  add
1a3e0 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
1a3f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1a400 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72  r(v) + 1;.  addr
1a410 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
1a420 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
1a430 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1a440 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drA, 0, addrSele
1a450 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctA);.  VdbeComm
1a460 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45  ent((v, "left SE
1a470 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
1a480 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
1a490 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e  imitA;.  explain
1a4a0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
1a4b0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
1a4c0 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
1a4d0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1a4e0 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
1a4f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a500 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1a510 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1a520 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1a530 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f  (v, addr1);..  /
1a540 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1a550 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1a560 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1a570 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
1a580 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
1a590 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
1a5a0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
1a5b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a5c0 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
1a5d0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
1a5e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a5f0 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1a600 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
1a610 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
1a620 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
1a630 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
1a640 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
1a650 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
1a660 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
1a670 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
1a680 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
1a690 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
1a6a0 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
1a6b0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
1a6c0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
1a6d0 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
1a6e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1a6f0 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
1a700 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
1a710 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
1a720 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
1a730 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
1a740 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
1a750 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
1a760 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1a770 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1a780 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1a790 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
1a7a0 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
1a7b0 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
1a7c0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
1a7d0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
1a7e0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1a7f0 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
1a800 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
1a810 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
1a820 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1a830 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1a840 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1a850 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
1a860 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
1a870 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1a880 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1a890 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
1a8a0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1a8b0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
1a8c0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
1a8d0 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
1a8e0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
1a8f0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
1a900 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
1a910 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1a920 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
1a930 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
1a940 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a950 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
1a960 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
1a970 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
1a980 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
1a990 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
1a9b0 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
1a9c0 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
1a9d0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
1a9e0 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
1a9f0 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  End);.  }.  sqli
1aa00 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
1aa10 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20  pKeyDup);..  /* 
1aa20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1aa30 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1aa40 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1aa50 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
1aa60 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1aa70 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1aa80 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
1aa90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1aaa0 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
1aab0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1aac0 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  {.    addrEofA_n
1aad0 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20  oB = addrEofA = 
1aae0 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73  labelEnd;.  }els
1aaf0 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1ab00 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1ab10 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
1ab20 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  );.    addrEofA 
1ab30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ab40 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1ab50 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1ab60 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  tB);.    addrEof
1ab70 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56  A_noB = sqlite3V
1ab80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ab90 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1aba0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abd0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1abe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1abf0 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1ac00 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
1ac10 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
1ac20 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
1ac30 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
1ac40 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d  nSelectRow);.  }
1ac50 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1ac60 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1ac70 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1ac80 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1ac90 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
1aca0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1acb0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
1acc0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1acd0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1ace0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1acf0 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
1ad00 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
1ad10 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
1ad20 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
1ad30 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
1ad40 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1ad50 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1ad60 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1ad70 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
1ad80 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1ad90 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
1ada0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1adb0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1adc0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
1add0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ade0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1adf0 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45  regAddrA, labelE
1ae00 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
1ae10 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1ae20 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1ae30 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
1ae40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ae50 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1ae60 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
1ae70 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1ae80 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
1ae90 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1aea0 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
1aeb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1aec0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
1aed0 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
1aee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1aef0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1af00 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1af10 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1af20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1af30 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1af40 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
1af50 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1af60 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
1af70 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
1af80 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1af90 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1afa0 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
1afb0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1afc0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
1afd0 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1afe0 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
1aff0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
1b000 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1b010 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
1b020 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
1b030 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
1b040 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b050 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1b060 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1b070 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b080 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1b090 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1b0a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1b0b0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1b0c0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1b0d0 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
1b0e0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1b0f0 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
1b100 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
1b110 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1b120 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
1b130 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1b140 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1b150 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b160 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1b170 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1b180 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
1b190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b1a0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b1b0 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1b1c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b1d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b1e0 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1b1f0 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
1b200 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
1b210 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
1b220 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
1b230 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1b240 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
1b250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b260 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b270 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1b280 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65  A_noB); VdbeCove
1b290 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1b2a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b2b0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1b2c0 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1b2d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b2e0 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
1b2f0 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
1b300 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
1b310 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b320 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
1b330 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1b340 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
1b350 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
1b360 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
1b370 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
1b380 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b390 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
1b3a0 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
1b3b0 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
1b3c0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
1b3f0 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
1b400 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1b410 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
1b420 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
1b430 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1b440 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
1b450 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
1b460 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76  drAgtB); VdbeCov
1b470 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1b480 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
1b490 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
1b4a0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1b4b0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
1b4c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1b4d0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
1b4e0 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  nd);..  /* Set t
1b4f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
1b500 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  put columns.  */
1b510 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
1b520 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
1b530 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
1b540 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a  First = pPrior;.
1b550 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
1b560 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
1b570 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
1b580 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  ior;.    generat
1b590 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
1b5a0 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70 53 72  rse, pFirst->pSr
1b5b0 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  c, pFirst->pELis
1b5c0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  t);.  }..  /* Re
1b5d0 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
1b5e0 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
1b5f0 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
1b600 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
1b610 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
1b620 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
1b630 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1b640 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
1b650 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
1b660 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
1b670 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1b680 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e  or;.  pPrior->pN
1b690 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a  ext = p;..  /***
1b6a0 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75   TBD:  Insert su
1b6b0 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74  broutine calls t
1b6c0 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  o close cursors 
1b6d0 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20  on incomplete.  
1b6e0 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  **** subqueries 
1b6f0 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43  ****/.  explainC
1b700 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
1b710 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
1b720 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75  Sub2, 0);.  retu
1b730 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21  rn pParse->nErr!
1b740 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  =0;.}.#endif..#i
1b750 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1b760 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1b770 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1b780 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1b790 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
1b7a0 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
1b7b0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1b7c0 69 73 74 28 50 61 72 73 65 2a 2c 20 45 78 70 72  ist(Parse*, Expr
1b7d0 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72  List*, int, Expr
1b7e0 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1b7f0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1b800 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 20 2a  Parse*, Select *
1b810 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
1b820 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  , int);../*.** S
1b830 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
1b840 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1b850 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
1b860 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
1b870 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
1b880 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
1b890 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
1b8a0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
1b8b0 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
1b8c0 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
1b8d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1b8e0 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
1b8f0 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
1b900 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b910 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1b920 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
1b930 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
1b940 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
1b950 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
1b960 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
1b970 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
1b980 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
1b990 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
1b9a0 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
1b9b0 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
1b9c0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
1b9d0 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
1b9e0 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
1b9f0 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
1ba00 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
1ba10 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
1ba20 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
1ba30 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1ba40 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
1ba50 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1ba60 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
1ba70 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
1ba80 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
1ba90 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70  c Expr *substExp
1baa0 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
1bab0 73 65 2c 20 20 20 20 20 20 2f 2a 20 52 65 70 6f  se,      /* Repo
1bac0 72 74 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  rt errors here *
1bad0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
1bae0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
1baf0 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
1bb00 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
1bb10 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1bb20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1bb30 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
1bb40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1bb50 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
1bb60 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
1bb70 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ons */.){.  sqli
1bb80 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1bb90 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 45 78 70  ->db;.  if( pExp
1bba0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
1bbb0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1bbc0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
1bbd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
1bbe0 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
1bbf0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
1bc00 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1bc10 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
1bc20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bc30 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
1bc40 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20    Expr *pCopy = 
1bc50 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
1bc60 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b  >iColumn].pExpr;
1bc70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1bc80 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
1bc90 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
1bca0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1bcb0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1bcc0 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
1bcd0 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
1bce0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1bcf0 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
1bd00 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Copy) ){.       
1bd10 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
1bd20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
1bd30 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Copy);.      }el
1bd40 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
1bd50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1bd60 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b  p(db, pCopy, 0);
1bd70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1bd80 77 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  w && (pExpr->fla
1bd90 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
1bda0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
1bdb0 4e 65 77 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  New->iRightJoinT
1bdc0 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 52  able = pExpr->iR
1bdd0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20  ightJoinTable;. 
1bde0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66           pNew->f
1bdf0 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a  lags |= EP_FromJ
1be00 6f 69 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oin;.        }. 
1be10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1be20 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1be30 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
1be40 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  pr = pNew;.     
1be50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1be60 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
1be70 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ft = substExpr(p
1be80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1be90 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
1bea0 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  ist);.    pExpr-
1beb0 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45  >pRight = substE
1bec0 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
1bed0 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
1bee0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1bef0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1bf00 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1bf10 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1bf20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70 50    substSelect(pP
1bf30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70  arse, pExpr->x.p
1bf40 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1bf50 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20 20  pEList, 1);.    
1bf60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62  }else{.      sub
1bf70 73 74 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  stExprList(pPars
1bf80 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  e, pExpr->x.pLis
1bf90 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1bfa0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1bfb0 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
1bfc0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1bfd0 74 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  tExprList(.  Par
1bfe0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1bff0 20 20 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f    /* Report erro
1c000 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
1c010 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
1c020 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
1c030 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
1c040 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1c050 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
1c060 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1c070 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
1c080 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
1c090 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
1c0a0 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
1c0b0 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
1c0c0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1c0d0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1c0e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1c0f0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1c100 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1c110 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1c120 72 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  r(pParse, pList-
1c130 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
1c140 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1c150 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1c160 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 50  substSelect(.  P
1c170 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1c180 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 65 72      /* Report er
1c190 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
1c1a0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1c1b0 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
1c1c0 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
1c1d0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1c1e0 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
1c1f0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1c200 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1c210 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
1c220 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
1c230 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1c240 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1c250 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20   doPrior        
1c260 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75    /* Do substitu
1c270 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72  tes on p->pPrior
1c280 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63   too */.){.  Src
1c290 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
1c2a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c2b0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1c2c0 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
1c2d0 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  turn;.  do{.    
1c2e0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 50  substExprList(pP
1c2f0 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
1c300 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1c310 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
1c320 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
1c330 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c  GroupBy, iTable,
1c340 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
1c350 62 73 74 45 78 70 72 4c 69 73 74 28 70 50 61 72  bstExprList(pPar
1c360 73 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  se, p->pOrderBy,
1c370 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1c380 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
1c390 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 50 61   = substExpr(pPa
1c3a0 72 73 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  rse, p->pHaving,
1c3b0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1c3c0 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
1c3d0 3d 20 73 75 62 73 74 45 78 70 72 28 70 50 61 72  = substExpr(pPar
1c3e0 73 65 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69  se, p->pWhere, i
1c3f0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1c400 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53      pSrc = p->pS
1c410 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
1c420 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66  pSrc!=0 );.    f
1c430 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c  or(i=pSrc->nSrc,
1c440 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20   pItem=pSrc->a; 
1c450 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
1c460 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53  +){.      substS
1c470 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 49  elect(pParse, pI
1c480 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  tem->pSelect, iT
1c490 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31 29  able, pEList, 1)
1c4a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
1c4b0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
1c4c0 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74  ){.        subst
1c4d0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1c4e0 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
1c4f0 41 72 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  Arg, iTable, pEL
1c500 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
1c510 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f    }.  }while( do
1c520 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d  Prior && (p = p-
1c530 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d  >pPrior)!=0 );.}
1c540 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
1c550 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1c560 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1c570 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1c580 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20  T_VIEW) */..#if 
1c590 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1c5a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1c5b0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1c5c0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
1c5d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c5e0 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
1c5f0 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61  ten subqueries a
1c600 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
1c610 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  optimization..**
1c620 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1c630 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
1c640 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
1c650 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
1c660 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ng occurs..**.**
1c670 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
1c680 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
1c690 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
1c6a0 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
1c6b0 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
1c6c0 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
1c6d0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
1c6e0 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
1c6f0 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
1c700 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
1c710 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
1c720 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
1c730 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
1c740 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
1c750 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
1c760 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
1c770 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
1c780 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
1c790 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c7a0 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
1c7b0 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
1c7c0 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
1c7d0 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
1c7e0 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
1c7f0 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
1c800 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
1c810 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
1c820 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
1c830 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
1c840 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
1c850 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
1c860 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c870 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
1c880 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
1c890 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
1c8a0 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
1c8b0 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
1c8c0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1c8d0 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
1c8e0 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1c8f0 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
1c900 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
1c910 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
1c920 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67  simplification g
1c930 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65  ives the same re
1c940 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79  sult.** but only
1c950 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65   has to scan the
1c960 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64   data once.  And
1c970 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73   because indices
1c980 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74   might .** exist
1c990 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31   on the table t1
1c9a0 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61  , a complete sca
1c9b0 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69  n of the data mi
1c9c0 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65  ght be.** avoide
1c9d0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e  d..**.** Flatten
1c9e0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ing is only atte
1c9f0 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20  mpted if all of 
1ca00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
1ca10 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
1ca20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
1ca30 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1ca40 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1ca50 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  h use aggregates
1ca60 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54  ..**.**   (2)  T
1ca70 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1ca80 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1ca90 6f 72 20 28 32 61 29 20 74 68 65 20 6f 75 74 65  or (2a) the oute
1caa0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1cab0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
1cac0 61 6e 64 20 28 32 62 29 20 74 68 65 20 6f 75 74  and (2b) the out
1cad0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
1cae0 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65 73  t use subqueries
1caf0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1cb00 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 46 52  one.**        FR
1cb10 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1cb20 72 79 20 74 68 61 74 20 69 73 20 61 20 63 61 6e  ry that is a can
1cb30 64 69 64 61 74 65 20 66 6f 72 20 66 6c 61 74 74  didate for flatt
1cb40 65 6e 69 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a  ening.  (2b is.*
1cb50 2a 20 20 20 20 20 20 20 20 64 75 65 20 74 6f 20  *        due to 
1cb60 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37  ticket [2f7170d7
1cb70 33 62 66 39 61 62 66 38 30 5d 20 66 72 6f 6d 20  3bf9abf80] from 
1cb80 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a  2015-02-09.).**.
1cb90 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
1cba0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
1cbb0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1cbc0 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
1cbd0 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  join.**        (
1cbe0 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65  Originally ticke
1cbf0 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74  t #306.  Strengt
1cc00 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20  hened by ticket 
1cc10 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28  #3300).**.**   (
1cc20 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1cc30 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
1cc40 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41  ..**.**  (**)  A
1cc50 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74  t one point rest
1cc60 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64  rictions (4) and
1cc70 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73   (5) defined a s
1cc80 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43  ubset of DISTINC
1cc90 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d  T.**        sub-
1cca0 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72  queries that wer
1ccb0 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
1ccc0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1ccd0 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a  n. Restriction .
1cce0 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61  **        (4) ha
1ccf0 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70  s since been exp
1cd00 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65  anded to exclude
1cd10 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75   all DISTINCT su
1cd20 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  bqueries..**.** 
1cd30 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
1cd40 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1cd50 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
1cd60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1cd70 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1cd80 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1cd90 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
1cda0 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
1cdb0 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
1cdc0 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
1cdd0 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
1cde0 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
1cdf0 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
1ce00 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68   FROM close with
1ce10 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
1ce20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c         table sql
1ce30 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f  ite_once that co
1ce40 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67  nsists of a sing
1ce50 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  le row containin
1ce60 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69  g a.**        si
1ce70 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  ngle NULL..**.**
1ce80 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
1ce90 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1cea0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1ceb0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1cec0 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
1ced0 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
1cee0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1cef0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1cf00 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1cf10 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
1cf20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1cf30 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69  **  (**)  Restri
1cf40 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72  ction (10) was r
1cf50 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1cf60 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d  code on 2005-02-
1cf70 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20  05 but we.**    
1cf80 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63      accidently c
1cf90 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65  arried the comme
1cfa0 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c  nt forward until
1cfb0 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72   2014-09-15.  Or
1cfc0 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  iginal.**       
1cfd0 20 74 65 78 74 3a 20 22 54 68 65 20 73 75 62 71   text: "The subq
1cfe0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1cff0 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
1d000 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d010 0a 2a 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20  .**        does 
1d020 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a  not use LIMIT.".
1d030 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
1d040 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1d050 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1d060 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
1d070 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
1d080 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f  .**.**  (**)  No
1d090 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
1d0a0 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
1d0b0 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
1d0c0 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
1d0d0 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
1d0e0 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
1d0f0 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
1d100 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
1d110 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
1d120 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
1d130 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1d140 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
1d150 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
1d160 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1d170 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  se OFFSET..**.**
1d180 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65    (15)  The oute
1d190 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70  r query is not p
1d1a0 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
1d1b0 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a  d select or the.
1d1c0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
1d1d0 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
1d1e0 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
1d1f0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
1d200 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
1d210 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
1d220 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
1d230 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
1d240 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1d250 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
1d260 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
1d270 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
1d280 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
1d290 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
1d2a0 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
1d2b0 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
1d2c0 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
1d2d0 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
1d2e0 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
1d2f0 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
1d300 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
1d310 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
1d320 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
1d330 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
1d340 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
1d350 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
1d360 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
1d370 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1d380 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
1d390 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
1d3a0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
1d3b0 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
1d3c0 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
1d3d0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
1d3e0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1d3f0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1d400 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
1d410 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
1d420 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f     * is not a jo
1d430 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  in.**.**        
1d440 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
1d450 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
1d460 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
1d470 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
1d480 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
1d490 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
1d4a0 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
1d4b0 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
1d4c0 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
1d4d0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
1d4e0 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62  lauses.  The sub
1d4f0 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65  query cannot use
1d500 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1d510 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1d520 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
1d530 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c  N ALL because al
1d540 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70  l the other comp
1d550 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1d560 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e  perators have an
1d570 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43   implied DISTINC
1d580 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c  T which is disal
1d590 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
1d5a0 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28     restriction (
1d5b0 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  4)..**.**       
1d5c0 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70   Also, each comp
1d5d0 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62  onent of the sub
1d5e0 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75  -query must retu
1d5f0 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  rn the same numb
1d600 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  er.**        of 
1d610 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
1d620 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79  This is actually
1d630 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66   a requirement f
1d640 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  or any compound.
1d650 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1d660 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
1d670 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72  all the code her
1d680 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  e does is make s
1d690 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20  ure that no.**  
1d6a0 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65        such (ille
1d6b0 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69  gal) sub-query i
1d6c0 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65  s flattened. The
1d6d0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74   caller will det
1d6e0 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ect the.**      
1d6f0 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61    syntax error a
1d700 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61  nd return a deta
1d710 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  iled message..**
1d720 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
1d730 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1d740 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1d750 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
1d760 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
1d770 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
1d780 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
1d790 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
1d7a0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
1d7b0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
1d7c0 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1d7d0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
1d7e0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1d7f0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1d800 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1d810 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
1d820 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
1d830 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
1d840 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75   (20)  If the su
1d850 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1d860 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1d870 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75  en it must not u
1d880 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  se.**        an 
1d890 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1d8a0 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20    Ticket #3773. 
1d8b0 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20   We could relax 
1d8c0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a  this constraint.
1d8d0 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68  **        somewh
1d8e0 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61  at by saying tha
1d8f0 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  t the terms of t
1d900 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1d910 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20  se must.**      
1d920 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f    appear as unmo
1d930 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f  dified result co
1d940 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74  lumns in the out
1d950 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77  er query.  But w
1d960 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  e.**        have
1d970 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
1d980 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20  ions in mind to 
1d990 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63  deal with that c
1d9a0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29  ase..**.**  (21)
1d9b0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1d9c0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1d9d0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1d9e0 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
1d9f0 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
1da00 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
1da10 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
1da20 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62  *  (22)  The sub
1da30 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72  query is not a r
1da40 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a  ecursive CTE..**
1da50 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20 70  .**  (23)  The p
1da60 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72  arent is not a r
1da70 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72  ecursive CTE, or
1da80 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1da90 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20  s not a.**      
1daa0 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79    compound query
1dab0 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  . This restricti
1dac0 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72  on is because tr
1dad0 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a  ansforming the.*
1dae0 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20  *        parent 
1daf0 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  to a compound qu
1db00 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65  ery confuses the
1db10 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c   code that handl
1db20 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63  es.**        rec
1db30 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69  ursive queries i
1db40 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e  n multiSelect().
1db50 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68  .**.**  (24)  Th
1db60 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1db70 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74  t an aggregate t
1db80 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69  hat uses the bui
1db90 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a  lt-in min() or .
1dba0 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78  **        or max
1dbb0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28  () functions.  (
1dbc0 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73  Without this res
1dbd0 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72  triction, a quer
1dbe0 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20  y like:.**      
1dbf0 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d    "SELECT x FROM
1dc00 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c   (SELECT max(y),
1dc10 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75   x FROM t1)" wou
1dc20 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  ld not necessari
1dc30 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74  ly.**        ret
1dc40 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20  urn the value X 
1dc50 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20  for which Y was 
1dc60 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a  maximal.).**.**.
1dc70 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
1dc80 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
1dc90 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
1dca0 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
1dcb0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
1dcc0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
1dcd0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
1dce0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1dcf0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
1dd00 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
1dd10 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
1dd20 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1dd30 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1dd40 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1dd50 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1dd60 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
1dd70 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1dd80 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
1dd90 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
1dda0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
1ddb0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
1ddc0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
1ddd0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
1dde0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
1ddf0 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
1de00 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
1de10 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
1de20 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
1de30 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1de40 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
1de50 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
1de60 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
1de70 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
1de80 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1de90 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1dea0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1deb0 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
1dec0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ded0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1dee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1def0 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
1df00 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
1df10 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
1df20 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
1df30 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
1df40 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
1df50 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1df60 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
1df70 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
1df80 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
1df90 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
1dfa0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1dfb0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1dfc0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1dfd0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1dfe0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1dff0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
1e000 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55      /* Current U
1e010 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66  NION ALL term of
1e020 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79   the other query
1e030 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1e040 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
1e050 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
1e060 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
1e070 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
1e080 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1e090 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
1e0a0 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
1e0b0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1e0c0 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
1e0d0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1e0e0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1e0f0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1e100 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
1e110 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1e120 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
1e130 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1e140 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
1e150 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1e160 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1e170 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
1e180 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
1e190 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
1e1a0 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
1e1b0 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
1e1c0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1e1d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1e1e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
1e1f0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e210 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1e220 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1e230 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
1e240 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
1e250 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
1e260 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e270 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ->db;..  /* Chec
1e280 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
1e290 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1e2a0 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
1e2b0 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  f not..  */.  as
1e2c0 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
1e2d0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
1e2e0 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62  r==0 );  /* Unab
1e2f0 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f  le to flatten co
1e300 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a  mpound queries *
1e310 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
1e320 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1e330 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
1e340 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
1e350 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
1e360 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1e370 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
1e380 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
1e390 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
1e3a0 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
1e3b0 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
1e3c0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
1e3d0 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
1e3e0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1e3f0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
1e400 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71  =0 );.  if( subq
1e410 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1e420 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65 74   if( isAgg ) ret
1e430 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e450 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e460 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20  tion (1)   */.  
1e470 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
1e480 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1e4b0 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20  ction (2a)  */. 
1e4c0 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72     if( (p->pWher
1e4d0 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  e && ExprHasProp
1e4e0 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45  erty(p->pWhere,E
1e4f0 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20 20  P_Subquery)).   
1e500 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70    || (sqlite3Exp
1e510 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45  rListFlags(p->pE
1e520 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71 75  List) & EP_Subqu
1e530 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ery)!=0.     || 
1e540 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  (sqlite3ExprList
1e550 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42  Flags(p->pOrderB
1e560 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79  y) & EP_Subquery
1e570 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
1e580 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e5c0 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20  ion (2b)  */.   
1e5d0 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53   }.  }.    .  pS
1e5e0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1e5f0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1e600 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1e610 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1e620 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1e630 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1e640 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1e650 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1e660 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1e670 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
1e680 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
1e690 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
1e6a0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
1e6b0 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
1e6c0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
1e6d0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
1e6e0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1e6f0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
1e700 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
1e710 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
1e720 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
1e730 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
1e740 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
1e750 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1e760 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
1e770 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
1e780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e790 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
1e7a0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1e7b0 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
1e7c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e7e0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
1e7f0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1e800 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
1e810 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
1e820 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
1e830 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e860 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e870 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
1e880 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1e890 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
1e8a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e8b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1e8c0 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
1e8d0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1e8e0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1e8f0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1e900 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1e910 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20  iction (5)  */. 
1e920 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1e930 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
1e940 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
1e950 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1e960 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1e970 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
1e980 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1e990 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1e9a0 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
1e9b0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1e9c0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1e9d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e9e0 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
1e9f0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1ea00 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1ea10 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1ea20 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea50 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ea60 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1ea70 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1ea80 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1ea90 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1eaa0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1eab0 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1eac0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1ead0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1eae0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1eaf0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1eb00 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1eb10 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1eb20 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1eb30 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1eb40 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1eb50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1eb60 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1eb70 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
1eb80 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1eb90 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
1eba0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  ;.  testcase( pS
1ebb0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1ebc0 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20  F_MinMaxAgg );. 
1ebd0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1ebe0 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
1ebf0 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67  ive|SF_MinMaxAgg
1ec00 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1ec10 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1ec20 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29  ns (22) and (24)
1ec30 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1ec40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1ec50 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53  Recursive) && pS
1ec60 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1ec70 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1ec80 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20  estriction (23) 
1ec90 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53  */.  }..  /* OBS
1eca0 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
1ecb0 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
1ecc0 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
1ecd0 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
1ece0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1ecf0 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
1ed00 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
1ed10 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1ed20 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
1ed30 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
1ed40 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
1ed50 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1ed60 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1ed70 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1ed80 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
1ed90 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1eda0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1edb0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1edc0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1edd0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1ede0 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
1edf0 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
1ee00 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
1ee10 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
1ee20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
1ee30 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
1ee40 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
1ee50 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1ee60 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1ee70 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1ee80 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
1ee90 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1eea0 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
1eeb0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
1eec0 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
1eed0 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1eee0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1eef0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1ef00 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1ef10 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
1ef20 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
1ef30 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
1ef40 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
1ef50 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
1ef60 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1ef70 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
1ef80 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
1ef90 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
1efa0 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
1efb0 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
1efc0 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
1efd0 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
1efe0 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
1eff0 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
1f000 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
1f010 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
1f020 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
1f030 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
1f040 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
1f050 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
1f060 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
1f070 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
1f080 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1f090 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
1f0a0 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
1f0b0 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
1f0c0 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
1f0d0 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
1f0e0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1f0f0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
1f100 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1f110 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
1f120 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
1f130 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67  f( (pSubitem->fg
1f140 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
1f150 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
1f160 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1f170 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1f180 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  17: If the sub-q
1f190 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1f1a0 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
1f1b0 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
1f1c0 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
1f1d0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
1f1e0 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
1f1f0 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
1f200 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
1f210 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
1f220 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
1f230 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
1f240 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
1f250 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
1f260 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1f270 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
1f280 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1f290 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
1f2a0 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
1f2b0 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d  tion 20 */.    }
1f2c0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
1f2d0 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1f2e0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1f2f0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
1f300 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
1f310 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
1f320 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
1f330 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
1f340 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
1f350 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1f360 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1f370 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1f380 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
1f390 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
1f3a0 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1f3b0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1f3c0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1f3d0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
1f3e0 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
1f3f0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1f400 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
1f410 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
1f420 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
1f430 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
1f440 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
1f450 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1f460 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1f470 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
1f480 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
1f490 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
1f4a0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
1f4b0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
1f4c0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20  ->pSrc->nSrc<1. 
1f4d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1f4e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1f4f0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
1f500 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
1f510 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
1f520 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f530 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66  on 18. */.    if
1f540 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
1f550 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
1f560 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1f570 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
1f580 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1f590 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
1f5a0 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
1f5b0 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
1f5c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1f5d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1f5e0 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
1f5f0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
1f600 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1f610 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20  mitted. *****/. 
1f620 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
1f630 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65  Parse,p,("flatte
1f640 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72  n %s.%p from ter
1f650 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m %d\n",.       
1f660 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
1f670 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62  ->zSelName, pSub
1f680 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
1f690 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
1f6a0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
1f6b0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1f6c0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
1f6d0 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
1f6e0 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
1f6f0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1f700 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1f710 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
1f720 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
1f730 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
1f740 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
1f750 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
1f760 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
1f770 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1f780 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
1f790 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
1f7a0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
1f7b0 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
1f7c0 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
1f7d0 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
1f7e0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1f7f0 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
1f800 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
1f810 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1f820 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
1f830 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
1f840 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
1f850 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
1f860 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
1f870 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
1f880 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1f890 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
1f8a0 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
1f8b0 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
1f8c0 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
1f8d0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1f8e0 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
1f8f0 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
1f900 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
1f910 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
1f920 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
1f930 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
1f940 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
1f950 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
1f960 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f970 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
1f980 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
1f990 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
1f9a0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
1f9b0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
1f9c0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1f9d0 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
1f9e0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
1f9f0 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
1fa00 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
1fa10 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1fa20 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
1fa30 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1fa40 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1fa50 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
1fa60 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
1fa70 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
1fa80 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
1fa90 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
1faa0 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
1fab0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
1fac0 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
1fad0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
1fae0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1faf0 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
1fb00 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
1fb10 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1fb20 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1fb30 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
1fb40 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
1fb50 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
1fb60 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
1fb70 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
1fb80 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
1fb90 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1fba0 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
1fbb0 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
1fbc0 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
1fbd0 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
1fbe0 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
1fbf0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
1fc00 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
1fc10 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1fc20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
1fc30 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
1fc40 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20  Expr *pOffset = 
1fc50 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
1fc60 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
1fc70 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
1fc80 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
1fc90 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
1fca0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
1fcb0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
1fcc0 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  it = 0;.    p->p
1fcd0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
1fce0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
1fcf0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30  lectDup(db, p, 0
1fd00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1fd10 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77  lectSetName(pNew
1fd20 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65  , pSub->zSelName
1fd30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  );.    p->pOffse
1fd40 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
1fd50 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
1fd60 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
1fd70 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1fd80 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
1fd90 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
1fda0 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
1fdb0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1fdc0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1fdd0 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
1fde0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
1fdf0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1fe00 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
1fe10 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1fe20 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
1fe30 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
1fe40 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1fe50 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
1fe60 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
1fe70 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63  ,p,.         ("c
1fe80 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1fe90 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74   flattener creat
1fea0 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
1feb0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e  \n",.         pN
1fec0 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e  ew->zSelName, pN
1fed0 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew));.    }.    
1fee0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1fef0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1ff00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1ff10 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1ff20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
1ff30 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1ff40 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
1ff50 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
1ff60 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
1ff70 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1ff80 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
1ff90 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
1ffa0 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
1ffb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ffc0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1ffd0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
1ffe0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1fff0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
20000 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
20010 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
20020 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
20030 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
20040 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
20050 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
20060 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
20070 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
20080 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
20090 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
200a0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
200b0 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
200c0 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
200d0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
200e0 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
200f0 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
20100 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
20110 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
20120 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
20130 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
20140 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
20150 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
20160 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
20170 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
20180 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
20190 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
201a0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
201b0 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
201c0 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
201d0 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
201e0 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
201f0 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
20200 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
20210 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
20220 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
20230 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
20240 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
20250 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
20260 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
20270 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
20280 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
20290 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
202a0 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
202b0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
202c0 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
202d0 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
202e0 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
202f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
20300 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
20310 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
20320 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
20330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
20340 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
20350 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
20360 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
20370 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
20380 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
20390 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
203a0 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
203b0 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
203c0 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
203d0 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
203e0 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
203f0 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
20400 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
20410 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
20420 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
20430 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
20440 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
20450 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
20460 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
20470 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
20480 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
20490 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
204a0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
204b0 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
204c0 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
204d0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
204e0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
204f0 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
20500 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
20510 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
20520 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
20530 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
20540 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
20550 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
20560 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
20570 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
20580 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
20590 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
205a0 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
205b0 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
205c0 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
205d0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
205e0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
205f0 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
20600 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
20610 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
20620 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
20630 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
20640 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
20650 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
20660 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
20670 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
20680 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
20690 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
206a0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
206b0 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
206c0 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
206d0 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
206e0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
206f0 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
20700 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
20710 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
20720 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
20730 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
20740 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
20750 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
20760 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
20770 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
20780 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
20790 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
207a0 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
207b0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  >fg.jointype;.  
207c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
207d0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
207e0 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
207f0 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
20800 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
20810 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
20820 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
20830 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
20840 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
20850 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20860 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSrc==0 ){.     
20870 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
20880 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
20890 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
208a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
208b0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
208c0 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73   uses a single s
208d0 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  lot of the FROM 
208e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
208f0 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ter.    ** query
20900 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  .  If the subque
20910 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  ry has more than
20920 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20   one element in 
20930 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  its FROM clause,
20940 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70  .    ** then exp
20950 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
20960 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  ery to make spac
20970 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64  e for it to hold
20980 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20   all elements.  
20990 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71    ** of the subq
209a0 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uery..    **.   
209b0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
209c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45   **.    **    SE
209d0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41  LECT * FROM tabA
209e0 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , (SELECT * FROM
209f0 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61   sub1, sub2), ta
20a00 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  bB;.    **.    *
20a10 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72  * The outer quer
20a20 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e  y has 3 slots in
20a30 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
20a40 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74  .  One slot of t
20a50 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
20a60 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c  query (the middl
20a70 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20  e slot) is used 
20a80 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  by the subquery.
20a90 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a    The next.    *
20aa0 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  * block of code 
20ab0 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20  will expand the 
20ac0 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
20ad0 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f   clause to 4 slo
20ae0 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d  ts..    ** The m
20af0 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78  iddle slot is ex
20b00 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
20b10 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
20b20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a  make space.    *
20b30 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c  * for the two el
20b40 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
20b50 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
20b60 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
20b70 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
20b80 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
20b90 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
20ba0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
20bb0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
20bc0 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
20bd0 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
20be0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
20bf0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
20c00 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
20c10 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
20c20 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
20c30 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
20c40 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
20c50 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
20c60 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
20c70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
20c80 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
20c90 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
20ca0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
20cb0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
20cc0 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ing);.      asse
20cd0 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  rt( pSrc->a[i+iF
20ce0 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e  rom].fg.isTabFun
20cf0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  c==0 );.      pS
20d00 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
20d10 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
20d20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
20d30 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
20d40 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
20d50 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
20d60 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d    pSrc->a[iFrom]
20d70 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  .fg.jointype = j
20d80 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20  ointype;.  .    
20d90 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
20da0 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
20db0 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
20dc0 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
20dd0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
20de0 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
20df0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
20e00 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  ry..    ** .    
20e10 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
20e20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
20e30 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
20e40 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
20e50 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
20e60 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
20e70 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20  ;.    **   \    
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e90 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
20ea0 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
20eb0 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
20ec0 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f      **    \_____
20ed0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20ee0 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
20ef0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20f00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20  ___________/.   
20f10 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f   **.    ** We lo
20f20 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
20f30 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
20f40 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
20f50 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
20f60 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73  .    ** "a" we s
20f70 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
20f80 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
20f90 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
20fa0 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
20fb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73  .    */.    pLis
20fc0 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  t = pParent->pEL
20fd0 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
20fe0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
20ff0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
21000 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
21010 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
21020 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
21030 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
21040 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
21050 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
21060 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
21070 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
21080 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
21090 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
210a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
210b0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
210c0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68  {.      /* At th
210d0 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f  is point, any no
210e0 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43  n-zero iOrderByC
210f0 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61  ol values indica
21100 74 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  te that the.    
21110 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f    ** ORDER BY co
21120 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
21130 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20  is identical to 
21140 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27  the iOrderByCol'
21150 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  th.      ** expr
21160 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ession returned 
21170 62 79 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  by SELECT statem
21180 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20  ent pSub. Since 
21190 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20  these values.   
211a0 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63     ** do not nec
211b0 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70  essarily corresp
211c0 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ond to columns i
211d0 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
211e0 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20  nt pParent,.    
211f0 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62    ** zero them b
21200 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e  efore transferin
21210 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
21220 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  lause..      **.
21230 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69        ** Not doi
21240 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61 75 73  ng this may caus
21250 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20  e an error if a 
21260 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
21270 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  to this.      **
21280 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
21290 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20  ts to flatten a 
212a0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
212b0 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a  ry into pParent.
212c0 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e        ** (the on
212d0 6c 79 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  ly way this can 
212e0 68 61 70 70 65 6e 20 69 73 20 69 66 20 74 68 65  happen is if the
212f0 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
21300 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ery is.      ** 
21310 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f  currently part o
21320 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53  f pSub->pSrc). S
21330 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36  ee ticket [d11a6
21340 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20  e908f].  */.    
21350 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
21360 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
21370 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72  derBy;.      for
21380 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
21390 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
213a0 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
213b0 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
213c0 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  ByCol = 0;.     
213d0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
213e0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
213f0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  By==0 );.      a
21400 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72  ssert( pSub->pPr
21410 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ior==0 );.      
21420 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
21430 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
21440 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
21450 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  By = 0;.    }.  
21460 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
21470 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
21480 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a  ub->pWhere, 0);.
21490 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79      if( subquery
214a0 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61  IsAgg ){.      a
214b0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
214c0 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
214d0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
214e0 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e  ving = pParent->
214f0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
21500 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
21510 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
21520 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
21530 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
21540 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  db, .          s
21550 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
21560 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c  , pSub->pHaving,
21570 20 30 29 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48   0), pParent->pH
21580 61 76 69 6e 67 0a 20 20 20 20 20 20 29 3b 0a 20  aving.      );. 
21590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
215a0 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  rent->pGroupBy==
215b0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
215c0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  nt->pGroupBy = s
215d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
215e0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f  p(db, pSub->pGro
215f0 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65  upBy, 0);.    }e
21600 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65  lse{.      pPare
21610 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  nt->pWhere = sql
21620 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
21630 70 57 68 65 72 65 2c 20 70 50 61 72 65 6e 74 2d  pWhere, pParent-
21640 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a  >pWhere);.    }.
21650 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
21660 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c  pParse, pParent,
21670 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
21680 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 0a 20  pEList, 0);.  . 
21690 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
216a0 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
216b0 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
216c0 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
216d0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
216e0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
216f0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
21700 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
21710 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
21720 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
21730 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
21740 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
21750 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
21760 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
21770 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
21780 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
21790 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
217a0 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
217b0 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
217c0 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
217d0 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
217e0 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
217f0 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
21800 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
21810 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
21820 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
21830 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
21840 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
21850 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
21860 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
21870 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
21880 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
21890 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
218a0 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
218b0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
218c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
218d0 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
218e0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
218f0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
21900 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
21910 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
21920 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
21930 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
21940 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  After flattening
21950 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
21960 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
21970 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
21980 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
21990 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
219a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
219b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
219c0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
219d0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
219e0 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
219f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21a00 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
21a10 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
21a20 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63  EW)./*.** Make c
21a30 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e  opies of relevan
21a40 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  t WHERE clause t
21a50 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65  erms of the oute
21a60 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20  r query into.** 
21a70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
21a80 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45   of subquery.  E
21a90 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
21aa0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
21ab0 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
21ac0 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29  -d AS y FROM t1)
21ad0 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
21ae0 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  =10;.**.** Trans
21af0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a  formed into:.**.
21b00 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
21b10 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
21b20 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
21b30 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41  M t1 WHERE a=5 A
21b40 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20  ND c-d=10).**   
21b50 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20    WHERE x=5 AND 
21b60 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  y=10;.**.** The 
21b70 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65  hope is that the
21b80 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20   terms added to 
21b90 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
21ba0 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72  will make it mor
21bb0 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a  e.** efficient..
21bc0 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  **.** Do not att
21bd0 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69  empt this optimi
21be0 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  zation if:.**.**
21bf0 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e 65 72     (1) The inner
21c00 20 71 75 65 72 79 20 69 73 20 61 6e 20 61 67 67   query is an agg
21c10 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74 68 61  regate.  (In tha
21c20 74 20 63 61 73 65 2c 20 77 65 27 64 20 72 65 61  t case, we'd rea
21c30 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20  lly want.**     
21c40 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 75    to copy the ou
21c50 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
21c60 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
21c70 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66  HAVING clause of
21c80 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
21c90 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ner query.  But 
21ca0 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20 77 6f  they probably wo
21cb0 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65 20 73  n't help there s
21cc0 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e  o do not bother.
21cd0 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68  ).**.**   (2) Th
21ce0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
21cf0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
21d00 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20  art of a common 
21d10 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
21d20 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68  ..**.**   (3) Th
21d30 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61  e inner query ha
21d40 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
21d50 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e   (since the chan
21d60 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  ges to the WHERE
21d70 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20  .**       close 
21d80 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
21d90 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
21da0 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
21db0 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
21dc0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21dd0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21de0 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63  FT JOIN.  (The c
21df0 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65  aller.**       e
21e00 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72 65 73  nforces this res
21e10 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74  triction since t
21e20 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
21e30 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68   not have enough
21e40 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d  .**       inform
21e50 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a  ation to know.).
21e60 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
21e70 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
21e80 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
21e90 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
21ea0 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
21eb0 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
21ec0 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  JOIN..**.** Retu
21ed0 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67  rn 0 if no chang
21ee0 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20  es are made and 
21ef0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20  non-zero if one 
21f00 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c  or more WHERE cl
21f10 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72  ause.** terms ar
21f20 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74  e duplicated int
21f30 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  o the subquery..
21f40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75  */.static int pu
21f50 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
21f60 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21f70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
21f80 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20  se context (for 
21f90 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72  malloc() and err
21fa0 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f  or reporting) */
21fb0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
21fc0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
21fd0 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20 57  subquery whose W
21fe0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
21ff0 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a  o be augmented *
22000 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
22010 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
22020 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
22030 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
22040 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f   */.  int iCurso
22050 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  r           /* C
22060 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
22070 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
22080 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
22090 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
220a0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20  ;.  Select *pX; 
220b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
220c0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 63 6f   looping over co
220d0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 69  mpound SELECTs i
220e0 6e 20 70 53 75 62 71 20 2a 2f 0a 20 20 69 66 28  n pSubq */.  if(
220f0 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74   pWhere==0 ) ret
22100 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70 58 3d  urn 0;.  for(pX=
22110 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58  pSubq; pX; pX=pX
22120 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69  ->pPrior){.    i
22130 66 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73  f( (pX->selFlags
22140 20 26 20 28 53 46 5f 41 67 67 72 65 67 61 74 65   & (SF_Aggregate
22150 7c 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 21  |SF_Recursive))!
22160 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
22170 63 61 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c 61  case( pX->selFla
22180 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
22190 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
221a0 61 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c 61 67  ase( pX->selFlag
221b0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
221c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
221d0 73 65 28 20 70 58 21 3d 70 53 75 62 71 20 29 3b  se( pX!=pSubq );
221e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
221f0 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73   /* restrictions
22200 20 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a   (1) and (2) */.
22210 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
22220 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
22230 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
22240 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
22250 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68   (3) */.  }.  wh
22260 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
22270 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e  =TK_AND ){.    n
22280 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e  Chng += pushDown
22290 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
222a0 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  e, pSubq, pWhere
222b0 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f  ->pRight, iCurso
222c0 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  r);.    pWhere =
222d0 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
222e0 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61    }.  if( ExprHa
222f0 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
22300 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20  ,EP_FromJoin) ) 
22310 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
22320 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20 20  triction 5 */.  
22330 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
22340 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
22350 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20  Where, iCursor) 
22360 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a  ){.    nChng++;.
22370 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71      while( pSubq
22380 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
22390 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
223a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65  pParse->db, pWhe
223b0 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  re, 0);.      pN
223c0 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ew = substExpr(p
223d0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 69 43 75  Parse, pNew, iCu
223e0 72 73 6f 72 2c 20 70 53 75 62 71 2d 3e 70 45 4c  rsor, pSubq->pEL
223f0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 53 75 62  ist);.      pSub
22400 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  q->pWhere = sqli
22410 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
22420 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57  e->db, pSubq->pW
22430 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20  here, pNew);.   
22440 20 20 20 70 53 75 62 71 20 3d 20 70 53 75 62 71     pSubq = pSubq
22450 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a  ->pPrior;.    }.
22460 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68    }.  return nCh
22470 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ng;.}.#endif /* 
22480 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
22490 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
224a0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
224b0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
224c0 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20  ./*.** Based on 
224d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
224e0 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
224f0 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
22500 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  by the first.** 
22510 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66  argument, this f
22520 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
22530 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
22540 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
22550 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20 63     * the query c
22560 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73  ontains just a s
22570 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65 20  ingle aggregate 
22580 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20  function,.**    
22590 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  * the aggregate 
225a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68  function is eith
225b0 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  er min() or max(
225c0 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74  ), and.**    * t
225d0 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
225e0 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
225f0 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ction is a colum
22600 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  n value..**.** I
22610 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
22620 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68 65  ve are true, the
22630 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
22640 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
22650 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72  ERBY_MAX.** is r
22660 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f  eturned as appro
22670 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70  priate. Also, *p
22680 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74  pMinMax is set t
22690 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a  o point to the .
226a0 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d  ** list of argum
226b0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74  ents passed to t
226c0 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65 66  he aggregate bef
226d0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
226e0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  *.** Or, if the 
226f0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
22700 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70   are not met, *p
22710 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74  pMinMax is set t
22720 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45  o 0 and.** WHERE
22730 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20  _ORDERBY_NORMAL 
22740 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
22750 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78  static u8 minMax
22760 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70  Query(AggInfo *p
22770 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73  AggInfo, ExprLis
22780 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20  t **ppMinMax){. 
22790 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52   int eRet = WHER
227a0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
227b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
227c0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
227d0 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a   *ppMinMax = 0;.
227e0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
227f0 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20  nFunc==1 ){.    
22800 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41  Expr *pExpr = pA
22810 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
22820 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65  .pExpr; /* Aggre
22830 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
22840 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
22850 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
22860 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  .pList;      /* 
22870 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
22880 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
22890 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
228a0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
228b0 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  TION );.    if( 
228c0 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
228d0 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ->nExpr==1 && pE
228e0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
228f0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
22900 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  UMN ){.      con
22910 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d  st char *zFunc =
22920 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
22930 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
22940 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
22950 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20  , "min")==0 ){. 
22960 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48         eRet = WH
22970 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
22980 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d  .        *ppMinM
22990 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  ax = pEList;.   
229a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
229b0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
229c0 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a  c, "max")==0 ){.
229d0 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
229e0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
229f0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
22a00 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
22a10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22a20 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69  .  assert( *ppMi
22a30 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d  nMax==0 || (*ppM
22a40 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31  inMax)->nExpr==1
22a50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65   );.  return eRe
22a60 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
22a70 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
22a80 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
22a90 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
22aa0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
22ab0 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
22ac0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
22ad0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
22ae0 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
22af0 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
22b00 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
22b10 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
22b20 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
22b30 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
22b40 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
22b50 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
22b60 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
22b70 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
22b80 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
22b90 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
22ba0 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
22bb0 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
22bc0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
22bd0 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
22be0 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
22bf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
22c00 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
22c10 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
22c20 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
22c30 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
22c40 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
22c50 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
22c60 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
22c70 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
22c80 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
22c90 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
22ca0 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
22cb0 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
22cc0 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
22cd0 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
22ce0 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
22cf0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
22d00 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
22d10 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
22d20 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
22d30 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
22d40 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
22d50 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
22d60 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
22d70 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
22d80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
22d90 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
22da0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
22db0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
22dc0 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e  NEVER(pAggInfo->
22dd0 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75  nFunc==0) ) retu
22de0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
22df0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
22e00 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
22e10 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
22e20 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
22e30 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
22e40 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
22e50 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
22e60 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
22e70 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
22e80 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
22e90 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
22ea0 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
22eb0 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
22ec0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
22ed0 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
22ee0 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
22ef0 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
22f00 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
22f10 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
22f20 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
22f30 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
22f40 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
22f50 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
22f60 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
22f70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
22f80 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
22f90 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
22fa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
22fb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
22fc0 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
22fd0 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
22fe0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22ff0 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
23000 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
23010 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  om->fg.isIndexed
23020 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  By ){.    Table 
23030 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
23040 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
23050 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f  IndexedBy = pFro
23060 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
23070 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
23080 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
23090 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
230a0 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
230b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
230c0 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
230d0 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20  xedBy); .       
230e0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
230f0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
23100 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
23110 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23120 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
23130 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
23140 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20  dexedBy, 0);.   
23150 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
23160 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
23170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23180 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
23190 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78   pFrom->pIBIndex
231a0 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
231b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
231c0 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20  .}./*.** Detect 
231d0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
231e0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
231f0 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  use an ORDER BY 
23200 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20  clause with .** 
23210 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  an alternative c
23220 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
23230 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e..**.**    SELE
23240 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
23250 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
23260 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
23270 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e  Y .. COLLATE ...
23280 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  .**.** These are
23290 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
232a0 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  subquery:.**.** 
232b0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
232c0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f   (SELECT ... FRO
232d0 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
232e0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a  CT ... FROM t2).
232f0 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
23300 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a  ... COLLATE ....
23310 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
23320 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63  formation is nec
23330 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74  essary because t
23340 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  he multiSelectOr
23350 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a  derBy() routine.
23360 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65  ** above that ge
23370 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
23380 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   for a compound 
23390 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f  SELECT with an O
233a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
233b0 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61  * uses a merge a
233c0 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65  lgorithm that re
233d0 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20  quires the same 
233e0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
233f0 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73  ce on the.** res
23400 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f  ult columns as o
23410 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
23420 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b  lause.  See tick
23430 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77  et.** http://www
23440 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
23450 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a  info/6709574d2a.
23460 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
23470 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
23480 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43  y needed for EXC
23490 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20  EPT, INTERSECT, 
234a0 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68  and UNION..** Th
234b0 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
234c0 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20  ator works fine 
234d0 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74  with multiSelect
234e0 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77  OrderBy() even w
234f0 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  hen.** there are
23500 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69   COLLATE terms i
23510 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  n the ORDER BY..
23520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
23530 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
23540 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61  ectToSubquery(Wa
23550 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
23560 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
23570 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   i;.  Select *pN
23580 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58  ew;.  Select *pX
23590 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
235a0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
235b0 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72  st_item *a;.  Sr
235c0 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a  cList *pNewSrc;.
235d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
235e0 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
235f0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
23600 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23610 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28  _Continue;.  if(
23620 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
23630 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
23640 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d  tinue;.  for(pX=
23650 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70  p; pX && (pX->op
23660 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e  ==TK_ALL || pX->
23670 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20  op==TK_SELECT); 
23680 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d  pX=pX->pPrior){}
23690 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72  .  if( pX==0 ) r
236a0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
236b0 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72  ue;.  a = p->pOr
236c0 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28  derBy->a;.  for(
236d0 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i=p->pOrderBy->n
236e0 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Expr-1; i>=0; i-
236f0 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d  -){.    if( a[i]
23700 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  .pExpr->flags & 
23710 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65  EP_Collate ) bre
23720 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  ak;.  }.  if( i<
23730 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
23740 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49  ontinue;..  /* I
23750 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
23760 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
23770 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  s the transforma
23780 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
23790 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  . */..  pParse =
237a0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
237b0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
237c0 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
237d0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
237e0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
237f0 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
23800 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  w==0 ) return WR
23810 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65  C_Abort;.  memse
23820 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a  t(&dummy, 0, siz
23830 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70  eof(dummy));.  p
23840 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33  NewSrc = sqlite3
23850 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
23860 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30  mTerm(pParse,0,0
23870 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30  ,0,&dummy,pNew,0
23880 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53  ,0);.  if( pNewS
23890 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  rc==0 ) return W
238a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65  RC_Abort;.  *pNe
238b0 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72  w = *p;.  p->pSr
238c0 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70  c = pNewSrc;.  p
238d0 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
238e0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
238f0 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69  (pParse, 0, sqli
23900 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41  te3Expr(db, TK_A
23910 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20  STERISK, 0));.  
23920 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
23930 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
23940 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
23950 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
23960 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
23970 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
23980 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
23990 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74   = 0;.  p->pNext
239a0 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68   = 0;.  p->pWith
239b0 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c   = 0;.  p->selFl
239c0 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
239d0 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28  und;.  assert( (
239e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
239f0 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29  _Converted)==0 )
23a00 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
23a10 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b  |= SF_Converted;
23a20 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
23a30 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20  >pPrior!=0 );.  
23a40 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  pNew->pPrior->pN
23a50 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
23a60 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
23a70 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
23a80 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
23a90 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
23aa0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
23ab0 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  e if the FROM cl
23ac0 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20  ause term pFrom 
23ad0 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  has table-valued
23ae0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67   function.** arg
23af0 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64  uments.  If it d
23b00 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  oes, leave an er
23b10 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
23b20 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
23b30 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69  .** non-zero, si
23b40 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74  nce pFrom is not
23b50 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
23b60 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
23b70 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
23b80 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75  c int cannotBeFu
23b90 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  nction(Parse *pP
23ba0 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
23bb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
23bc0 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
23bd0 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
23be0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23bf0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25 73  Msg(pParse, "'%s
23c00 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74  ' is not a funct
23c10 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61  ion", pFrom->zNa
23c20 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
23c30 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
23c40 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
23c50 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
23c60 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69  .** Argument pWi
23c70 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  th (which may be
23c80 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f   NULL) points to
23c90 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
23ca0 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54  f nested .** WIT
23cb0 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d  H contexts, from
23cc0 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d   inner to outerm
23cd0 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c  ost. If the tabl
23ce0 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
23cf0 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
23d00 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73  element pItem is
23d10 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e   really a common
23d20 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f  -table-expressio
23d30 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e  n (CTE) .** then
23d40 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
23d50 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66  r to the CTE def
23d60 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  inition for that
23d70 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73   table. Otherwis
23d80 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c  e.** return NULL
23d90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e  ..**.** If a non
23da0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72  -NULL value is r
23db0 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70  eturned, set *pp
23dc0 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74  Context to point
23dd0 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20   to the With.** 
23de0 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20  object that the 
23df0 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c  returned CTE bel
23e00 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ongs to..*/.stat
23e10 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73  ic struct Cte *s
23e20 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74  earchWith(.  Wit
23e30 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e50 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73  Current innermos
23e60 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f  t WITH clause */
23e70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
23e80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20  t_item *pItem,  
23e90 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
23ea0 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73  e element to res
23eb0 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a  olve */.  With *
23ec0 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20  *ppContext      
23ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
23ee0 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65  : WITH clause re
23ef0 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e  turn value belon
23f00 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f  gs to */.){.  co
23f10 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
23f20 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44  .  if( pItem->zD
23f30 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a  atabase==0 && (z
23f40 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  Name = pItem->zN
23f50 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57  ame)!=0 ){.    W
23f60 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  ith *p;.    for(
23f70 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d  p=pWith; p; p=p-
23f80 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20  >pOuter){.      
23f90 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
23fa0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
23fb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
23fc0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
23fd0 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d  p(zName, p->a[i]
23fe0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
23ff0 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65          *ppConte
24000 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
24010 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69    return &p->a[i
24020 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
24030 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
24040 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
24050 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
24060 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  tor maintains a 
24070 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20  stack of active 
24080 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20  WITH clauses.** 
24090 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d  with the inner-m
240a0 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
240b0 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70  being at the top
240c0 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   of the stack..*
240d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
240e0 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54  e pushes the WIT
240f0 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20  H clause passed 
24100 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
24110 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74  gument.** onto t
24120 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
24130 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  ack. If argument
24140 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20   bFree is true, 
24150 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54  then this.** WIT
24160 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65  H clause will ne
24170 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72  ver be popped fr
24180 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e  om the stack. In
24190 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a   this case it.**
241a0 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64   should be freed
241b0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
241c0 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e  Parse object. In
241d0 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68   other cases, wh
241e0 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20  en.** bFree==0, 
241f0 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20  the With object 
24200 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c  will be freed al
24210 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c  ong with the SEL
24220 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ECT .** statemen
24230 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20  t with which it 
24240 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a  is associated..*
24250 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
24260 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  thPush(Parse *pP
24270 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74  arse, With *pWit
24280 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20  h, u8 bFree){.  
24290 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30  assert( bFree==0
242a0 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69   || (pParse->pWi
242b0 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  th==0 && pParse-
242c0 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29  >pWithToFree==0)
242d0 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20   );.  if( pWith 
242e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
242f0 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57  Parse->pWith!=pW
24300 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68  ith );.    pWith
24310 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73  ->pOuter = pPars
24320 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50  e->pWith;.    pP
24330 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
24340 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72  ith;.    if( bFr
24350 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69  ee ) pParse->pWi
24360 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68  thToFree = pWith
24370 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
24380 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
24390 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
243a0 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
243b0 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
243c0 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
243d0 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
243e0 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
243f0 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
24400 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
24410 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
24420 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
24430 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
24440 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
24450 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
24460 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
24470 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
24480 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
24490 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
244a0 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
244b0 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
244c0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
244d0 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
244e0 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
244f0 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
24500 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
24510 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
24520 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
24530 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
24540 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
24550 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
24560 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
24570 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
24580 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
24590 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
245a0 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
245b0 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
245c0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
245d0 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
245e0 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
245f0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
24600 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
24610 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
24620 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
24630 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
24640 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
24650 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24660 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
24670 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
24680 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
24690 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
246a0 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
246b0 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
246c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
246d0 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
246e0 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
246f0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24710 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
24720 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
24730 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
24740 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
24750 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
24760 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
24770 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
24780 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
24790 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
247a0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
247b0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
247c0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
247d0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
247e0 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
247f0 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
24800 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24810 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
24820 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
24830 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
24840 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
24850 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
24860 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
24870 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
24880 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
24890 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
248a0 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
248b0 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  /* If pCte->zCte
248c0 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  Err is non-NULL 
248d0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
248e0 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69  hen this is an i
248f0 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65  llegal.    ** re
24900 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
24910 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c  e to CTE pCte. L
24920 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
24930 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
24940 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e  rn.    ** early.
24950 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72   If pCte->zCteEr
24960 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
24970 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  this is not a re
24980 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
24990 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  e..    ** In thi
249a0 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e  s case, proceed.
249b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74    */.    if( pCt
249c0 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20  e->zCteErr ){.  
249d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
249e0 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65  Msg(pParse, pCte
249f0 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d  ->zCteErr, pCte-
24a00 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
24a10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
24a20 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
24a30 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  ( cannotBeFuncti
24a40 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  on(pParse, pFrom
24a50 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
24a60 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73  E_ERROR;..    as
24a70 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
24a80 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f  b==0 );.    pFro
24a90 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
24aa0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
24ab0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
24ac0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
24ad0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
24ae0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
24af0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
24b00 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e   1;.    pTab->zN
24b10 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
24b20 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  trDup(db, pCte->
24b30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
24b40 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
24b50 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
24b60 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
24b70 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
24b80 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
24b90 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
24ba0 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
24bb0 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  ral | TF_NoVisib
24bc0 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72  leRowid;.    pFr
24bd0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
24be0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
24bf0 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
24c00 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
24c10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
24c30 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61  OMEM_BKPT;.    a
24c40 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
24c50 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  elect );..    /*
24c60 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
24c70 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  s a recursive CT
24c80 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d  E. */.    pSel =
24c90 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
24ca0 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69  .    bMayRecursi
24cb0 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d  ve = ( pSel->op=
24cc0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d  =TK_ALL || pSel-
24cd0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
24ce0 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
24cf0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
24d00 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63  int i;.      Src
24d10 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72  List *pSrc = pFr
24d20 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  om->pSelect->pSr
24d30 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  c;.      for(i=0
24d40 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
24d50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
24d60 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
24d70 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63  m *pItem = &pSrc
24d80 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
24d90 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
24da0 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20  base==0 .       
24db0 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d    && pItem->zNam
24dc0 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e!=0 .         &
24dd0 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
24de0 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  Cmp(pItem->zName
24df0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20  , pCte->zName). 
24e00 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
24e10 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
24e20 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
24e30 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
24e40 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
24e50 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
24e60 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
24e70 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
24e80 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69  gs |= SF_Recursi
24e90 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ve;.        }.  
24ea0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
24eb0 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63   /* Only one rec
24ec0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
24ed0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
24ee0 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  / .    if( pTab-
24ef0 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20  >nTabRef>2 ){.  
24f00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
24f10 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
24f20 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
24f30 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
24f40 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
24f50 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
24f60 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
24f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24f80 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
24f90 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61  ssert( pTab->nTa
24fa0 62 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65  bRef==1 || ((pSe
24fb0 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52  l->selFlags&SF_R
24fc0 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61  ecursive) && pTa
24fd0 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29 29  b->nTabRef==2 ))
24fe0 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74  ;..    pCte->zCt
24ff0 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72  eErr = "circular
25000 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b   reference: %s";
25010 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20  .    pSavedWith 
25020 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
25030 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
25040 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
25050 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25060 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52  t(pWalker, bMayR
25070 65 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d  ecursive ? pSel-
25080 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b  >pPrior : pSel);
25090 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
250a0 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20  th = pWith;..   
250b0 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b   for(pLeft=pSel;
250c0 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20   pLeft->pPrior; 
250d0 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72  pLeft=pLeft->pPr
250e0 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74  ior);.    pEList
250f0 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74   = pLeft->pEList
25100 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  ;.    if( pCte->
25110 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69  pCols ){.      i
25120 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
25130 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65  ist->nExpr!=pCte
25140 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29  ->pCols->nExpr )
25150 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25160 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
25170 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
25180 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64  %d values for %d
25190 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20   columns",.     
251a0 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61         pCte->zNa
251b0 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  me, pEList->nExp
251c0 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r, pCte->pCols->
251d0 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b  nExpr.        );
251e0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
251f0 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
25200 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ith;.        ret
25210 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25230 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70  pEList = pCte->p
25240 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cols;.    }..   
25250 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
25260 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
25270 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61  se, pEList, &pTa
25280 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
25290 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  aCol);.    if( b
252a0 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
252b0 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e        if( pSel->
252c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
252d0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
252e0 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
252f0 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63   = "multiple rec
25300 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
25310 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65  s: %s";.      }e
25320 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
25330 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65  e->zCteErr = "re
25340 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
25350 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a  e in a subquery:
25360 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
25370 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
25380 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
25390 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
253a0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
253b0 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  0;.    pParse->p
253c0 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74  With = pSavedWit
253d0 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  h;.  }..  return
253e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
253f0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
25400 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
25410 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
25420 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  T passed as the 
25430 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
25440 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65  has an associate
25450 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73  d WITH .** claus
25460 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74  e, pop it from t
25470 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20  he stack stored 
25480 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50  as part of the P
25490 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  arse object..**.
254a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
254b0 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
254c0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
254d0 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a  () callback by.*
254e0 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  * sqlite3SelectE
254f0 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c  xpand() when wal
25500 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72  king a SELECT tr
25510 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61  ee to resolve ta
25520 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64  ble.** names and
25530 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
25540 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f  se elements. .*/
25550 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
25560 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65  ectPopWith(Walke
25570 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
25580 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
25590 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
255a0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74  r->pParse;.  Wit
255b0 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52  h *pWith = findR
255c0 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
255d0 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21  th;.  if( pWith!
255e0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
255f0 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  ( pParse->pWith=
25600 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50  =pWith );.    pP
25610 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
25620 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d  ith->pOuter;.  }
25630 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
25640 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30   selectPopWith 0
25650 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
25660 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
25670 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
25680 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
25690 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
256a0 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
256b0 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
256c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
256d0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
256e0 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
256f0 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
25700 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
25710 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
25720 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
25730 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
25740 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
25750 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
25760 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
25770 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
25780 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
25790 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
257a0 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
257b0 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
257c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
257d0 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
257e0 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
257f0 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
25800 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
25810 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
25820 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
25830 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
25840 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
25850 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
25860 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
25870 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
25880 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
25890 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
258a0 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
258b0 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
258c0 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
258d0 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65  essing up the pe
258e0 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  rsistent represe
258f0 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
25900 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
25910 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
25920 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
25930 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
25940 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e  ccommodate the N
25950 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
25960 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
25970 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
25980 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
25990 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
259a0 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
259b0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
259c0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
259d0 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
259e0 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
259f0 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
25a00 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
25a10 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
25a20 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
25a30 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
25a40 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
25a50 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
25a60 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
25a70 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
25a80 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
25a90 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
25aa0 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
25ab0 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
25ac0 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
25ad0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
25ae0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25af0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
25b00 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
25b10 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
25b20 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
25b30 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
25b40 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
25b50 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
25b60 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
25b70 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
25b80 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70  , *pRight, *pExp
25b90 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67  r;.  u16 selFlag
25ba0 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b  s = p->selFlags;
25bb0 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ..  p->selFlags 
25bc0 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
25bd0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
25be0 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72  Failed  ){.    r
25bf0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25c00 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52  .  }.  if( NEVER
25c10 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20  (p->pSrc==0) || 
25c20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  (selFlags & SF_E
25c30 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20  xpanded)!=0 ){. 
25c40 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
25c50 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  une;.  }.  pTabL
25c60 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
25c70 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
25c80 69 73 74 3b 0a 20 20 69 66 28 20 70 57 61 6c 6b  ist;.  if( pWalk
25c90 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62  er->xSelectCallb
25ca0 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f 70 57  ack2==selectPopW
25cb0 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ith ){.    sqlit
25cc0 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
25cd0 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74  e, findRightmost
25ce0 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a  (p)->pWith, 0);.
25cf0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
25d00 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
25d10 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
25d20 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
25d30 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
25d40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
25d50 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
25d60 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
25d70 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
25d80 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
25d90 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f   pTabList);..  /
25da0 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
25db0 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
25dc0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
25dd0 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
25de0 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
25df0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
25e00 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
25e10 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
25e20 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
25e30 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
25e40 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
25e50 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
25e60 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
25e70 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
25e80 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
25e90 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
25ea0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
25eb0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
25ec0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73  e *pTab;.    ass
25ed0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69  ert( pFrom->fg.i
25ee0 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c  sRecursive==0 ||
25ef0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
25f00 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  );.    if( pFrom
25f10 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
25f20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25f30 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
25f40 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  pTab==0 );.#ifnd
25f50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
25f60 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45  TE.    if( withE
25f70 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70  xpand(pWalker, p
25f80 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57  From) ) return W
25f90 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66  RC_Abort;.    if
25fa0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20  ( pFrom->pTab ) 
25fb0 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20  {} else.#endif. 
25fc0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
25fd0 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
25fe0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
25ff0 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
26000 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
26010 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
26020 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
26030 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
26040 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
26050 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
26060 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
26070 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
26080 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
26090 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c    if( sqlite3Wal
260a0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
260b0 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20   pSel) ) return 
260c0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
260d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
260e0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
260f0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
26100 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
26110 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
26120 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
26130 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  rt;.      pTab->
26140 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20  nTabRef = 1;.   
26150 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
26160 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
26170 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25  db, "sqlite_sq_%
26180 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29  p", (void*)pTab)
26190 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
261a0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
261b0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
261c0 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  or; }.      sqli
261d0 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
261e0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
261f0 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61  Sel->pEList,&pTa
26200 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61  b->nCol,&pTab->a
26210 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
26220 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
26230 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
26240 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
26250 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
26260 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
26270 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  );.      pTab->t
26280 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
26290 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
262a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
262b0 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
262c0 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
262d0 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
262e0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
262f0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
26300 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
26310 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
26320 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
26330 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
26340 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
26350 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
26360 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
26370 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
26380 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66  ab->nTabRef>=0xf
26390 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
263a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
263b0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
263c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
263d0 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
263e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
263f0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
26400 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
26410 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
26420 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
26440 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
26450 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75      if( !IsVirtu
26460 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e  al(pTab) && cann
26470 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
26480 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
26490 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
264a0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
264b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
264c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
264d0 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
264e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
264f0 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
26500 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
26510 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
26520 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36  t ){.        i16
26530 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
26540 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
26550 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
26560 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
26570 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26580 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
26590 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
265a0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
265b0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
265c0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
265d0 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
265e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
265f0 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
26600 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  e(pFrom->pSelect
26610 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
26620 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70          nCol = p
26630 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
26640 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
26650 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -1;.        sqli
26660 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
26670 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
26680 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
26690 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pTab->nCol = nCo
266a0 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
266b0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
266c0 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
266d0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
266e0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
266f0 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
26700 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
26710 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
26720 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
26730 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
26740 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
26750 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
26760 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
26770 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
26780 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
26790 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
267a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
267b0 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
267c0 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
267d0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
267e0 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
267f0 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
26800 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
26810 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
26820 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
26830 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
26840 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
26850 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
26860 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
26870 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
26880 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
26890 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
268a0 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
268b0 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
268c0 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
268d0 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65   TK_ASTERISK ope
268e0 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
268f0 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
26900 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20   in the column. 
26910 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66   ** list.  The f
26920 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
26930 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
26940 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
26950 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
26960 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63  s and expand eac
26970 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
26980 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
26990 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62   in.  ** all tab
269a0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
269b0 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
269c0 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
269d0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
269e0 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
269f0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
26a00 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
26a10 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
26a20 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
26a30 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
26a40 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
26a50 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
26a60 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
26a70 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
26a80 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
26a90 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
26aa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
26ab0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
26ac0 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
26ad0 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
26ae0 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
26af0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
26b00 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
26b10 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
26b20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
26b30 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
26b40 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
26b50 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
26b60 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
26b70 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
26b80 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
26b90 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
26ba0 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
26bb0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
26bc0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
26bd0 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
26be0 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
26bf0 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
26c00 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
26c10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
26c20 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
26c30 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
26c40 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
26c50 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
26c60 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
26c70 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
26c80 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
26c90 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
26ca0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
26cb0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
26cc0 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
26cd0 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
26ce0 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
26cf0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
26d00 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
26d10 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b  ){.      pE = a[
26d20 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  k].pExpr;.      
26d30 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69  pRight = pE->pRi
26d40 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
26d50 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
26d60 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29  T || pRight!=0 )
26d70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
26d80 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a  op!=TK_ASTERISK.
26d90 20 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f         && (pE->o
26da0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
26db0 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45  ght->op!=TK_ASTE
26dc0 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20  RISK).      ){. 
26dd0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
26de0 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
26df0 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
26e00 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
26e10 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
26e20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
26e30 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
26e40 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
26e50 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20   a[k].pExpr);.  
26e60 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
26e70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
26e80 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
26e90 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
26ea0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
26eb0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
26ec0 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20  Expr-1].zSpan = 
26ed0 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[k].zSpan;.    
26ee0 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
26ef0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
26f00 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a  a[k].zSpan = 0;.
26f10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26f20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
26f30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26f40 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
26f50 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
26f60 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
26f70 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
26f80 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
26f90 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
26fa0 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
26fb0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
26fc0 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
26fd0 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
26fe0 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
26ff0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74   = 0;       /* t
27000 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
27010 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
27020 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
27030 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OT ){.          
27040 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66  assert( pE->pLef
27050 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
27060 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
27070 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70  asProperty(pE->p
27080 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Left, EP_IntValu
27090 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
270a0 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65  zTName = pE->pLe
270b0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
270c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
270d0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
270e0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
270f0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
27100 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
27110 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
27120 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
27130 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  ;.          Sele
27140 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d  ct *pSub = pFrom
27150 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
27160 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
27170 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
27180 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ias;.          c
27190 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
271a0 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  maName = 0;.    
271b0 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
271c0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
271d0 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
271e0 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
271f0 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
27200 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27210 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
27220 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
27230 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
27240 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53  ( pSub==0 || (pS
27250 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
27260 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
27270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27280 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSub = 0;.      
27290 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
272a0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
272b0 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
272c0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
272d0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
272e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
272f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62  .            iDb
27300 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
27310 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
27320 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
27330 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
27340 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64  ame = iDb>=0 ? d
27350 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
27360 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20  Name : "*";.    
27370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27380 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
27390 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
273a0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
273b0 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
273c0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
273d0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
273e0 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
273f0 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
27400 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
27410 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
27420 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
27430 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
27440 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
27450 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
27460 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
27470 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
27480 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
27490 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
274a0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
274b0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
274c0 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70   if( zTName && p
274d0 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  Sub.            
274e0 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68   && sqlite3Match
274f0 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70  SpanName(pSub->p
27500 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
27510 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29  n, 0, zTName, 0)
27520 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
27530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27540 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
27550 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
27560 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
27570 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
27580 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74  s 'hidden', omit
27590 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70   it from the exp
275a0 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  anded.          
275b0 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20    ** result-set 
275c0 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20  list unless the 
275d0 53 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53  SELECT has the S
275e0 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a  F_IncludeHidden.
275f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
27600 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20  it set..        
27610 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
27620 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c     if( (p->selFl
27630 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65  ags & SF_Include
27640 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20  Hidden)==0.     
27650 20 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64          && IsHid
27660 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
27670 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20  >aCol[j]) .     
27680 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
27690 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
276a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
276b0 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
276c0 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20  eSeen = 1;..    
276d0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
276e0 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a  && zTName==0 ){.
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
27700 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69  ( (pFrom->fg.joi
27710 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
27720 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
27730 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
27740 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
27750 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
27760 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
27770 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27780 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
27790 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
277a0 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
277b0 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
277d0 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
277e0 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
277f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
27800 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
27810 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27820 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27830 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
27840 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
27850 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
27860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27870 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
27880 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
27890 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
278a0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
278b0 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
278c0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
278d0 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
278e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
278f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
27910 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27920 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
27930 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
27940 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
27950 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
27960 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
27970 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
27980 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
27990 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
279a0 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
279b0 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
279c0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
279d0 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
279e0 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
279f0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
27a00 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
27a10 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
27a20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
27a30 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
27a40 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
27a60 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a   zSchemaName ){.
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
27a90 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
27aa0 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20  SchemaName);.   
27ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
27ac0 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
27ad0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
27ae0 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b  , pLeft, pExpr);
27af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
27b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27b10 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b30 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
27b40 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
27b50 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
27b60 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
27b70 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
27b80 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
27b90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27ba0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
27bc0 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
27bd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27be0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
27bf0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
27c00 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
27c10 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
27c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f         sqlite3To
27c30 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d  kenInit(&sColnam
27c40 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
27c50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27c60 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
27c70 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
27c80 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
27c90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
27ca0 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
27cb0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
27cc0 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
27cd0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
27ce0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
27cf0 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
27d00 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
27d10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
27d20 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
27d30 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
27d40 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
27d50 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
27d60 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
27d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27d80 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
27d90 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
27da0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dc0 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
27dd0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
27de0 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e10 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
27e20 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
27e30 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
27e40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27e50 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
27e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27e70 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
27e80 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
27e90 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
27ea0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
27eb0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27ec0 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
27ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27ee0 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
27ef0 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
27f00 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
27f10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
27f20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27f30 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
27f40 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
27f50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
27f60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27f70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
27f80 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
27f90 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
27fa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27fc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27fd0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
27fe0 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
27ff0 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
28000 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
28010 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
28020 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
28030 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
28040 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
28050 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
28060 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
28070 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
28080 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
28090 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
280a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
280b0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64  _Abort;.  }.#end
280c0 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
280d0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
280e0 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
280f0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
28100 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
28110 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
28120 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
28130 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
28140 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
28150 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
28160 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
28170 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
28180 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
28190 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
281a0 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
281b0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
281c0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
281d0 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
281e0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
281f0 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
28200 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
28210 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
28220 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
28230 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
28240 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
28250 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
28260 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
28270 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
28280 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
28290 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
282a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
282b0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
282c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
282d0 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
282e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
282f0 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
28300 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
28310 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
28320 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
28330 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
28340 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
28350 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
28360 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
28370 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
28380 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
28390 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
283a0 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
283b0 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
283c0 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
283d0 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
283e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
283f0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
28400 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
28410 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
28420 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
28430 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
28440 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
28450 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
28460 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
28470 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
28480 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
28490 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
284a0 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
284b0 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
284c0 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
284d0 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
284e0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
284f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
28500 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
28510 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
28520 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
28530 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
28540 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
28550 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
28560 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
28570 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
28580 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
28590 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
285a0 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  f( pParse->hasCo
285b0 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e  mpound ){.    w.
285c0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
285d0 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  = convertCompoun
285e0 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
285f0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  y;.    sqlite3Wa
28600 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
28610 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78  lect);.  }.  w.x
28620 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
28630 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b   selectExpander;
28640 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63 74 2d  .  if( (pSelect-
28650 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
28660 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b  ultiValue)==0 ){
28670 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
28680 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
28690 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73  PopWith;.  }.  s
286a0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
286b0 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
286c0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
286d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
286e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
286f0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
28700 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
28710 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
28720 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
28730 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
28740 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
28750 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
28760 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
28770 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
28780 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
28790 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
287a0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
287b0 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
287c0 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
287d0 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
287e0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
287f0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
28800 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
28810 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
28820 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
28830 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
28840 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
28850 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
28860 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
28870 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
28880 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
28890 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
288a0 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
288b0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
288c0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
288d0 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
288e0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
288f0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
28900 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
28910 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
28920 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
28930 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
28940 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
28950 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
28960 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28970 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
28980 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
28990 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
289a0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
289b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
289c0 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
289d0 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
289e0 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
289f0 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
28a00 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
28a10 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
28a20 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
28a30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
28a40 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
28a50 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
28a60 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
28a70 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
28a80 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
28a90 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
28aa0 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
28ab0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
28ac0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
28ad0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
28ae0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28af0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
28b00 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
28b10 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
28b20 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
28b30 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
28b40 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
28b50 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
28b60 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
28b70 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
28b80 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
28b90 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
28ba0 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
28bb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28bc0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
28bd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
28be0 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
28bf0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
28c00 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
28c10 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
28c20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
28c30 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
28c40 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
28c50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28c60 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
28c70 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
28c80 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
28c90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28ca0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
28cb0 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
28cc0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
28cd0 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
28ce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
28cf0 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
28d00 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
28d10 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
28d20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
28d30 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ck2 = selectAddS
28d40 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
28d50 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
28d60 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
28d70 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
28d80 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
28d90 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
28da0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
28db0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
28dc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
28dd0 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20  ets up a SELECT 
28de0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
28df0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
28e00 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
28e10 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
28e20 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
28e30 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
28e40 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
28e50 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
28e60 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
28e70 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
28e80 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
28e90 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
28ea0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
28eb0 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
28ec0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
28ed0 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
28ee0 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
28ef0 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
28f00 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
28f10 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
28f20 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
28f30 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
28f40 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
28f50 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
28f60 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
28f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
28f80 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
28f90 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
28fa0 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
28fb0 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
28fc0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
28fd0 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
28fe0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
28ff0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
29000 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
29010 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
29020 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
29030 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
29040 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
29050 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
29060 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
29070 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
29080 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
29090 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  *db;.  if( NEVER
290a0 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
290b0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
290c0 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  db;.  if( db->ma
290d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
290e0 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
290f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
29100 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
29110 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
29120 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
29130 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
29140 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
29150 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
29160 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
29170 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
29180 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
29190 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
291a0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
291b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
291c0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
291d0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
291e0 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
291f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
29200 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
29210 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
29220 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
29230 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
29240 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
29250 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
29260 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
29270 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
29280 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
29290 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
292a0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
292b0 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
292c0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
292d0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
292e0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
292f0 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
29300 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
29310 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
29320 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
29330 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
29340 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
29350 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
29360 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
29370 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
29380 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
29390 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
293a0 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
293b0 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
293c0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
293d0 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
293e0 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
293f0 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
29400 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
29410 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
29420 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
29430 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
29440 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
29450 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
29460 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
29470 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
29480 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
29490 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
294a0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
294b0 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
294c0 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
294d0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
294e0 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
294f0 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
29500 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
29510 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
29520 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
29530 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
29540 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
29550 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
29560 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
29570 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
29580 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
29590 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
295a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
295b0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
295c0 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
295d0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
295e0 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
295f0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
29600 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
29610 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
29620 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
29630 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
29640 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
29650 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
29660 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
29670 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
29680 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
29690 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
296a0 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
296b0 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
296c0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
296d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
296e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
296f0 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
29700 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
29710 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
29720 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
29730 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
29740 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
29750 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
29760 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
29770 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
29780 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
29790 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
297a0 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ist, 0, 0);.    
297b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
297c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
297d0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
297e0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
297f0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
29810 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
29820 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
29830 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
29840 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
29850 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
29860 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
29870 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
29880 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
29890 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
298a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
298b0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
298c0 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
298d0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
298e0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
298f0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
29900 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
29910 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
29920 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
29930 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
29940 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
29950 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
29960 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
29970 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
29980 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
29990 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
299a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
299b0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
299c0 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
299d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
299e0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
299f0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
29a00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
29a10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
29a20 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
29a30 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
29a40 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
29a50 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
29a60 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
29a70 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
29a80 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
29a90 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
29aa0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
29ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29ac0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
29ad0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
29ae0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
29af0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
29b00 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
29b10 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
29b20 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  egHit = 0;.  int
29b30 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30   addrHitTest = 0
29b40 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
29b50 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
29b60 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
29b70 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
29b80 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
29b90 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
29ba0 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
29bb0 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
29bc0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
29bd0 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
29be0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
29bf0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
29c00 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
29c10 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
29c20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
29c30 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
29c40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
29c50 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
29c60 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
29c70 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
29c80 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
29c90 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
29ca0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
29cb0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
29cc0 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
29cd0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
29ce0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
29cf0 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53  st, regAgg, 0, S
29d00 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b  QLITE_ECEL_DUP);
29d10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29d20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
29d30 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
29d40 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
29d50 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
29d60 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
29d70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
29d80 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
29d90 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d  testcase( nArg==
29da0 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63  0 );  /* Error c
29db0 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ondition */.    
29dc0 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
29dd0 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20  >1 );   /* Also 
29de0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
29df0 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
29e00 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
29e10 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
29e20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
29e30 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
29e40 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
29e50 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
29e60 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
29e70 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
29e80 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
29e90 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
29ea0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
29eb0 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
29ec0 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
29ed0 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
29ee0 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
29ef0 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
29f00 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
29f10 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
29f20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
29f30 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
29f40 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
29f50 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
29f60 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
29f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29f80 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
29f90 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
29fa0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
29fb0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
29fc0 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
29fd0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
29fe0 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
29ff0 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
2a000 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
2a010 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2a020 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
2a030 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
2a040 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
2a050 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
2a060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a070 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30  3(v, OP_AggStep0
2a080 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d  , 0, regAgg, pF-
2a090 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  >iMem);.    sqli
2a0a0 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
2a0b0 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  v, pF->pFunc, P4
2a0c0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
2a0d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2a0e0 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b  P5(v, (u8)nArg);
2a0f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2a100 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
2a110 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
2a120 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
2a130 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2a140 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
2a150 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
2a160 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
2a170 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2a180 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2a190 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
2a1a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2a1b0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2a1c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2a1d0 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61  /* Before popula
2a1e0 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
2a1f0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20  ator registers, 
2a200 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  clear the column
2a210 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68   cache..  ** Oth
2a220 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f  erwise, if any o
2a230 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63  f the required c
2a240 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
2a250 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
2a260 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74   .  ** in regist
2a270 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72  ers, sqlite3Expr
2a280 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f  Code() may use O
2a290 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20  P_SCopy to copy 
2a2a0 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74  the value.  ** t
2a2b0 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20  o pC->iMem. But 
2a2c0 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
2a2d0 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74  value is used, t
2a2e0 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69  he original regi
2a2f0 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61  ster.  ** may ha
2a300 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e  ve been used, in
2a310 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75  validating the u
2a320 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72  nderlying buffer
2a330 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a   holding the.  *
2a340 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76  * text or blob v
2a350 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74  alue. See ticket
2a360 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20   [883034dcb5].. 
2a370 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72   **.  ** Another
2a380 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20   solution would 
2a390 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  be to change the
2a3a0 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74   OP_SCopy used t
2a3b0 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20  o copy cached.  
2a3c0 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20  ** values to an 
2a3d0 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20  OP_Copy..  */.  
2a3e0 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20  if( regHit ){.  
2a3f0 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20    addrHitTest = 
2a400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a410 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48  1(v, OP_If, regH
2a420 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
2a430 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
2a440 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2a450 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
2a460 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
2a470 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
2a480 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
2a490 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
2a4a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2a4b0 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
2a4c0 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b  Expr, pC->iMem);
2a4d0 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
2a4e0 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
2a4f0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2a500 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2a510 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54  ;.  if( addrHitT
2a520 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  est ){.    sqlit
2a530 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2a540 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a  , addrHitTest);.
2a550 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
2a560 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
2a570 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
2a580 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20   to the VDBE to 
2a590 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65  explain a simple
2a5a0 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65  .** count(*) que
2a5b0 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e  ry ("SELECT coun
2a5c0 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29  t(*) FROM pTab")
2a5d0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
2a5e0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2a5f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2a600 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
2a610 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2a620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a630 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
2a640 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
2a650 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
2a660 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
2a670 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
2a680 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
2a6b0 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73  ed to optimize s
2a6c0 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  can, or NULL */.
2a6d0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
2a6e0 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
2a6f0 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20     int bCover = 
2a700 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73  (pIdx!=0 && (Has
2a710 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21  Rowid(pTab) || !
2a720 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
2a730 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63  x(pIdx)));.    c
2a740 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
2a750 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
2a760 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
2a770 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
2a780 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
2a790 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2a7a0 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
2a7b0 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
2a7c0 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2a7d0 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
2a7e0 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  "".    );.    sq
2a7f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2a800 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
2a810 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61  >pVdbe, OP_Expla
2a820 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
2a830 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71  ectId, 0, 0, zEq
2a840 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20  p, P4_DYNAMIC.  
2a850 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65    );.  }.}.#else
2a860 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
2a870 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62  nSimpleCount(a,b
2a880 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
2a890 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2a8a0 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
2a8b0 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
2a8c0 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
2a8d0 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
2a8e0 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e  sults are return
2a8f0 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
2a900 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
2a910 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65  tructure..** See
2a920 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c   comments in sql
2a930 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72  iteInt.h for fur
2a940 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ther information
2a950 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2a960 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
2a970 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2a980 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
2a990 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
2a9a0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
2a9b0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
2a9c0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
2a9d0 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
2a9e0 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
2a9f0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
2aa00 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
2aa10 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
2aa20 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
2aa30 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2aa40 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
2aa50 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2aa60 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
2aa70 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2aa80 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2aa90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
2aaa0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
2aab0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
2aac0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
2aad0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
2aae0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
2aaf0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
2ab00 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
2ab10 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
2ab20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2ab30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2ab40 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
2ab50 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2ab60 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
2ab70 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
2ab80 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
2ab90 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
2aba0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
2abb0 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
2abc0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
2abd0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
2abe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2abf0 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
2ac00 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
2ac10 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
2ac20 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20  t *pEList = 0;  
2ac30 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
2ac40 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
2ac50 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
2ac60 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
2ac70 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
2ac80 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
2ac90 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
2aca0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2acb0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
2acc0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
2acd0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
2ace0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
2acf0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
2ad00 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
2ad10 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
2ad20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
2ad30 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
2ad40 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
2ad50 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
2ad60 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
2ad70 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
2ad80 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2ad90 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
2ada0 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
2adb0 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
2adc0 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
2add0 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ord */.  SortCtx
2ade0 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20   sSort;         
2adf0 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
2ae00 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52  o code the ORDER
2ae10 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2ae20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
2ae30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
2ae40 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
2ae50 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
2ae60 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2ae80 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
2ae90 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
2aea0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
2aeb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2aec0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2aed0 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ction */..#ifnde
2aee0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2aef0 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73  PLAIN.  int iRes
2af00 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70  toreSelectId = p
2af10 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2af20 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  ;.  pParse->iSel
2af30 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
2af40 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b  iNextSelectId++;
2af50 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
2af60 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
2af70 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
2af80 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
2af90 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
2afa0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2afb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
2afc0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
2afd0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
2afe0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
2aff0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
2b000 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
2b010 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
2b020 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2b030 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e  BLED.  pParse->n
2b040 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a  SelectIndent++;.
2b050 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2b060 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69  pParse,p, ("begi
2b070 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22  n processing:\n"
2b080 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
2b090 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2b0a0 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x100 ){.    sqli
2b0b0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2b0c0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
2b0d0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2b0e0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2b0f0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2b100 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  !=SRT_DistFifo )
2b110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2b120 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2b130 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2b140 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
2b150 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2b160 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2b170 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  !=SRT_DistQueue 
2b180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2b190 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2b1a0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2b1b0 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20  _Queue );.  if( 
2b1c0 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
2b1d0 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
2b1e0 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
2b1f0 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
2b200 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2b210 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
2b220 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2b230 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
2b240 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
2b250 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c  t==SRT_Discard |
2b260 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2b270 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51  st->eDest==SRT_Q
2b280 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e  ueue  || pDest->
2b290 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
2b2a0 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ifo ||.         
2b2b0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2b2c0 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c  SRT_DistQueue ||
2b2d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2b2e0 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a  RT_Fifo);.    /*
2b2f0 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
2b300 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
2b310 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
2b320 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
2b330 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
2b340 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
2b350 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
2b360 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2b370 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
2b380 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
2b390 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
2b3a0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2b3b0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2b3c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
2b3d0 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
2b3e0 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  p, 0);.  memset(
2b3f0 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f  &sSort, 0, sizeo
2b400 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f  f(sSort));.  sSo
2b410 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
2b420 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
2b430 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2b440 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2b450 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
2b460 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
2b470 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2b480 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
2b490 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  >pEList!=0 );.  
2b4a0 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
2b4b0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2b4c0 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c  ate)!=0;.#if SEL
2b4d0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2b4e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2b4f0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2b500 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2b510 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2b520 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d  e,p, ("after nam
2b530 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22  e resolution:\n"
2b540 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2b550 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2b560 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2b570 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  if..  /* Try to 
2b580 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
2b590 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2b5a0 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68  lause up into th
2b5b0 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a  e main query.  *
2b5c0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2b5d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2b5e0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2b5f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2b600 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
2b610 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
2b620 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2b630 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2b640 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2b650 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2b660 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2b670 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
2b680 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
2b690 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20 54   isAggSub;.    T
2b6a0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
2b6b0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
2b6c0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2b6d0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
2b6e0 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
2b6f0 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
2b700 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
2b710 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
2b720 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
2b730 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
2b740 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
2b750 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
2b760 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2b770 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
2b780 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2b790 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
2b7a0 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
2b7b0 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7d0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2b7e0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
2b7f0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
2b800 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
2b810 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2b820 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  }..    isAggSub 
2b830 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
2b840 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2b850 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
2b860 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
2b870 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
2b880 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
2b890 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
2b8a0 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
2b8b0 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
2b8c0 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2b8d0 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
2b8e0 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
2b8f0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
2b900 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
2b910 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
2b920 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
2b930 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
2b940 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
2b950 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2b960 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2b970 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2b980 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
2b990 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2b9a0 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2b9b0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2b9c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2b9d0 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  f..  /* Get a po
2b9e0 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75  inter the VDBE u
2b9f0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2ba00 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  n, allocating a 
2ba10 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a  new VDBE if one.
2ba20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c    ** does not al
2ba30 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20  ready exist */. 
2ba40 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
2ba50 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
2ba60 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
2ba70 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e  elect_end;..#ifn
2ba80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ba90 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
2baa0 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
2bab0 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
2bac0 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
2bad0 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
2bae0 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
2baf0 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
2bb00 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
2bb10 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
2bb20 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
2bb30 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c  pDest);.    expl
2bb40 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
2bb50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2bb60 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2bb70 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  d);.#if SELECTTR
2bb80 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2bb90 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2bba0 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
2bbb0 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
2bbc0 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
2bbd0 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2bbe0 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
2bbf0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  f.    return rc;
2bc00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2bc10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2bc20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
2bc30 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2bc40 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
2bc50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2bc60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2bc70 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2bc80 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
2bc90 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2bca0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2bcb0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2bcc0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2bcd0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2bce0 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
2bcf0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
2bd00 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2bd10 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
2bd20 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2bd30 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
2bd40 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
2bd50 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
2bd60 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2bd70 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
2bd80 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
2bd90 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
2bda0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2bdb0 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
2bdc0 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
2bdd0 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
2bde0 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
2bdf0 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
2be00 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
2be10 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
2be20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
2be30 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
2be40 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
2be50 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
2be60 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
2be70 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
2be80 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
2be90 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
2bea0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
2beb0 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
2bec0 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2bed0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
2bee0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2bef0 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2bf00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2bf10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2bf20 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
2bf30 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2bf40 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2bf50 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
2bf60 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2bf70 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
2bf80 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
2bf90 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
2bfa0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
2bfb0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
2bfc0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
2bfd0 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
2bfe0 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
2bff0 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
2c000 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
2c010 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
2c020 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
2c030 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
2c040 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
2c050 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
2c060 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
2c070 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
2c080 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
2c090 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
2c0a0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
2c0b0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
2c0c0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
2c0d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
2c0e0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
2c0f0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2c100 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
2c110 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
2c120 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
2c130 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
2c140 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2c150 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
2c160 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
2c170 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
2c180 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
2c190 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
2c1a0 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
2c1b0 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67    if( (pItem->fg
2c1c0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
2c1d0 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26  UTER)==0.     &&
2c1e0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2c1f0 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
2c200 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  , p->pWhere, pIt
2c210 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20  em->iCursor).   
2c220 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   ){.#if SELECTTR
2c230 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2c240 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2c250 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2c260 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45   ){.        SELE
2c270 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
2c280 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57  arse,p,("After W
2c290 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68  HERE-clause push
2c2a0 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  -down:\n"));.   
2c2b0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
2c2c0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2c2d0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
2c2e0 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
2c2f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2c300 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2c310 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a   subquery.    **
2c320 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71  .    ** The subq
2c330 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e  uery is implemen
2c340 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
2c350 69 6e 65 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ine if all of th
2c360 65 73 65 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ese are true:.  
2c370 20 20 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20    **   (1)  The 
2c380 73 75 62 71 75 65 72 79 20 69 73 20 67 75 61 72  subquery is guar
2c390 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68 65  anteed to be the
2c3a0 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20   outer loop (so 
2c3b0 74 68 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 20  that it.    **  
2c3c0 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 6e        does not n
2c3d0 65 65 64 20 74 6f 20 62 65 20 63 6f 6d 70 75 74  eed to be comput
2c3e0 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ed more than onc
2c3f0 65 29 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20  e).    **   (2) 
2c400 20 54 68 65 20 41 4c 4c 20 6b 65 79 77 6f 72 64   The ALL keyword
2c410 20 61 66 74 65 72 20 53 45 4c 45 43 54 20 69 73   after SELECT is
2c420 20 6f 6d 69 74 74 65 64 2e 20 20 28 41 70 70 6c   omitted.  (Appl
2c430 69 63 61 74 69 6f 6e 73 20 61 72 65 0a 20 20 20  ications are.   
2c440 20 2a 2a 20 20 20 20 20 20 20 20 61 6c 6c 6f 77   **        allow
2c450 65 64 20 74 6f 20 73 61 79 20 22 53 45 4c 45 43  ed to say "SELEC
2c460 54 20 41 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f  T ALL" instead o
2c470 66 20 6a 75 73 74 20 22 53 45 4c 45 43 54 22 20  f just "SELECT" 
2c480 74 6f 20 64 69 73 61 62 6c 65 0a 20 20 20 20 2a  to disable.    *
2c490 2a 20 20 20 20 20 20 20 20 74 68 65 20 75 73 65  *        the use
2c4a0 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e   of co-routines.
2c4b0 29 0a 20 20 20 20 2a 2a 20 20 20 28 33 29 20 20  ).    **   (3)  
2c4c0 43 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20  Co-routines are 
2c4d0 6e 6f 74 20 64 69 73 61 62 6c 65 64 20 75 73 69  not disabled usi
2c4e0 6e 67 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ng sqlite3_test_
2c4f0 63 6f 6e 74 72 6f 6c 28 29 0a 20 20 20 20 2a 2a  control().    **
2c500 20 20 20 20 20 20 20 20 77 69 74 68 20 53 51 4c          with SQL
2c510 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2c520 49 4d 49 5a 41 54 49 4f 4e 53 2e 0a 20 20 20 20  IMIZATIONS..    
2c530 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20  **.    ** TODO: 
2c540 41 72 65 20 74 68 65 72 65 20 6f 74 68 65 72 20  Are there other 
2c550 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20 28  reasons beside (
2c560 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72  1) to use a co-r
2c570 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d  outine.    ** im
2c580 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20  plementation?.  
2c590 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d    */.    if( i==
2c5a0 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c  0.     && (pTabL
2c5b0 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20  ist->nSrc==1.   
2c5c0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61           || (pTa
2c5d0 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a  bList->a[1].fg.j
2c5e0 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54  ointype&(JT_LEFT
2c5f0 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20  |JT_CROSS))!=0) 
2c600 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20   /* (1) */.     
2c610 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
2c620 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 20 20 20 20  & SF_All)==0    
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c650 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 26 26  * (2) */.     &&
2c660 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2c670 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2c680 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 20 20  SubqCoroutine)  
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c6a0 28 33 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20  (3) */.    ){.  
2c6b0 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74      /* Implement
2c6c0 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
2c6d0 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  at will return a
2c6e0 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
2c6f0 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
2c700 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69  ** set on each i
2c710 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20  nvocation..     
2c720 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2c730 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
2c740 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2c750 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  )+1;.      pItem
2c760 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
2c770 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2c780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c790 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
2c7a0 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
2c7b0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20  ->regReturn, 0, 
2c7c0 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
2c7d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2c7e0 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  "%s", pItem->pTa
2c7f0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2c800 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
2c810 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
2c820 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2c830 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
2c840 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
2c850 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2c860 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  rn);.      expla
2c870 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74  inSetInteger(pIt
2c880 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28  em->iSelectId, (
2c890 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  u8)pParse->iNext
2c8a0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
2c8b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
2c8c0 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
2c8d0 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  st);.      pItem
2c8e0 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  ->pTab->nRowLogE
2c8f0 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65  st = pSub->nSele
2c900 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74  ctRow;.      pIt
2c910 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2c920 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ine = 1;.      p
2c930 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20  Item->regResult 
2c940 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
2c950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
2c960 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70  ndCoroutine(v, p
2c970 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2c980 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2c990 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2c9a0 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  ddrTop-1);.     
2c9b0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2c9c0 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
2c9d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c9e0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2c9f0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
2ca00 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65  t will fill an e
2ca10 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
2ca20 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ith.      ** the
2ca30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
2ca40 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65   subquery.  pIte
2ca50 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77  m->addrFillSub w
2ca60 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20  ill point.      
2ca70 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73  ** to the addres
2ca80 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  s of the generat
2ca90 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ed subroutine.  
2caa0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2cab0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72  .      ** is a r
2cac0 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65  egister allocate
2cad0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75  d to hold the su
2cae0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
2caf0 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f  address.      */
2cb00 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64  .      int topAd
2cb10 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  dr;.      int on
2cb20 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  ceAddr = 0;.    
2cb30 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20    int retAddr;. 
2cb40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
2cb50 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
2cb60 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
2cb70 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
2cb80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2cb90 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
2cba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2cbb0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2cbc0 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
2cbd0 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
2cbe0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
2cbf0 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
2cc00 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
2cc10 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
2cc20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2cc30 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
2cc40 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
2cc50 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
2cc60 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
2cc70 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
2cc80 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
2cc90 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
2cca0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2ccb0 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
2ccc0 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
2ccd0 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
2cce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ccf0 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
2cd00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2cd10 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2cd20 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
2cd30 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
2cd40 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2cd50 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2cd60 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
2cd70 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
2cd80 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
2cd90 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2cda0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
2cdb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
2cdc0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
2cdd0 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
2cde0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2cdf0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
2ce00 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2ce10 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
2ce20 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
2ce30 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
2ce40 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
2ce50 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
2ce60 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2ce70 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2ce80 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74   = pSub->nSelect
2ce90 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  Row;.      if( o
2cea0 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  nceAddr ) sqlite
2ceb0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2cec0 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20   onceAddr);.    
2ced0 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69    retAddr = sqli
2cee0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2cef0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65   OP_Return, pIte
2cf00 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2cf10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2cf20 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70  ((v, "end %s", p
2cf30 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2cf40 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
2cf50 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
2cf60 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64  , topAddr, retAd
2cf70 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
2cf80 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
2cf90 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
2cfa0 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
2cfb0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2cfc0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2cfd0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
2cfe0 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
2cff0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
2d000 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2d010 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65  /* Various eleme
2d020 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  nts of the SELEC
2d030 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f  T copied into lo
2d040 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f  cal variables fo
2d050 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  r.  ** convenien
2d060 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  ce */.  pEList =
2d070 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57   p->pEList;.  pW
2d080 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
2d090 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
2d0a0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
2d0b0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
2d0c0 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e  ng;.  sDistinct.
2d0d0 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c  isTnct = (p->sel
2d0e0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2d0f0 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45  nct)!=0;..#if SE
2d100 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2d110 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
2d120 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34  electTrace & 0x4
2d130 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
2d140 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
2d150 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c  se,p,("After all
2d160 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61   FROM-clause ana
2d170 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20  lysis:\n"));.   
2d180 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2d190 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2d1a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2d1b0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
2d1c0 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20  s DISTINCT with 
2d1d0 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20  an ORDER BY but 
2d1e0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
2d1f0 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69  ate, and .  ** i
2d200 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  f the select-lis
2d210 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
2d220 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69   the ORDER BY li
2d230 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75  st, then this qu
2d240 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ery.  ** can be 
2d250 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47  rewritten as a G
2d260 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65  ROUP BY. In othe
2d270 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20  r words, this:. 
2d280 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
2d290 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a  ECT DISTINCT xyz
2d2a0 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20   FROM ... ORDER 
2d2b0 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
2d2c0 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
2d2d0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
2d2e0 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f    SELECT xyz FRO
2d2f0 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78  M ... GROUP BY x
2d300 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  yz ORDER BY xyz.
2d310 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
2d320 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65  cond form is pre
2d330 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67  ferred as a sing
2d340 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d  le index (or tem
2d350 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20  p-table) may be 
2d360 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62  .  ** used for b
2d370 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  oth the ORDER BY
2d380 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72   and DISTINCT pr
2d390 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69  ocessing. As ori
2d3a0 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72  ginally .  ** wr
2d3b0 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20  itten the query 
2d3c0 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d  must use a temp-
2d3d0 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61  table for at lea
2d3e0 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52  st one of the OR
2d3f0 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64  DER .  ** BY and
2d400 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61   DISTINCT, and a
2d410 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72  n index or separ
2d420 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  ate temp-table f
2d430 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20  or the other..  
2d440 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
2d450 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
2d460 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
2d470 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
2d480 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45   .   && sqlite3E
2d490 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73  xprListCompare(s
2d4a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70  Sort.pOrderBy, p
2d4b0 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20  EList, -1)==0.  
2d4c0 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
2d4d0 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
2d4e0 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  ct;.    pGroupBy
2d4f0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d   = p->pGroupBy =
2d500 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2d510 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20  Dup(db, pEList, 
2d520 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63  0);.    /* Notic
2d530 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
2d540 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20  ght SF_Distinct 
2d550 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
2d560 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67   from p->selFlag
2d570 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44  s,.    ** the sD
2d580 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69  istinct.isTnct i
2d590 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65  s still set.  He
2d5a0 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72  nce, isTnct repr
2d5b0 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a  esents the.    *
2d5c0 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69  * original setti
2d5d0 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73  ng of the SF_Dis
2d5e0 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20  tinct flag, not 
2d5f0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
2d600 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ing */.    asser
2d610 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  t( sDistinct.isT
2d620 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45  nct );..#if SELE
2d630 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2d640 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2d650 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34  electTrace & 0x4
2d660 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45  00 ){.      SELE
2d670 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
2d680 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f  arse,p,("Transfo
2d690 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f  rm DISTINCT into
2d6a0 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b   GROUP BY:\n"));
2d6b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
2d6c0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2d6d0 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  p, 0);.    }.#en
2d6e0 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  dif.  }..  /* If
2d6f0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
2d700 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
2d710 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70 68  en create an eph
2d720 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a  emeral index to.
2d730 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74    ** do the sort
2d740 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20 73  ing.  But this s
2d750 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c  orting ephemeral
2d760 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
2d770 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75   up.  ** being u
2d780 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
2d790 61 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74  a can be extract
2d7a0 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
2d7b0 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20   order..  ** If 
2d7c0 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
2d7d0 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70  , then the OP_Op
2d7e0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
2d7f0 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ruction will be.
2d800 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20    ** changed to 
2d810 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20  an OP_Noop once 
2d820 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
2d830 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
2d840 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  ndex is.  ** not
2d850 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73 53   needed.  The sS
2d860 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d870 78 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  x variable is us
2d880 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
2d890 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67  .  ** that chang
2d8a0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53  e..  */.  if( sS
2d8b0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
2d8c0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2d8d0 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
2d8e0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2d8f0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2d900 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2d910 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , 0, pEList->nEx
2d920 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69  pr);.    sSort.i
2d930 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  ECursor = pParse
2d940 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53  ->nTab++;.    sS
2d950 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d960 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
2d970 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2d980 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2d990 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74  .          sSort
2d9a0 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74  .iECursor, sSort
2d9b0 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
2d9c0 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  +1+pEList->nExpr
2d9d0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28  , 0,.          (
2d9e0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
2d9f0 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20  P4_KEYINFO.     
2da00 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2da10 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2da20 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
2da30 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
2da40 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
2da50 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
2da60 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
2da70 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
2da80 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
2da90 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
2daa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2dab0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
2dac0 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
2dad0 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73  ->iSDParm, pELis
2dae0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
2daf0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
2db00 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
2db10 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
2db20 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
2db30 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2db40 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29  & SF_FixedLimit)
2db50 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53  ==0 ){.    p->nS
2db60 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20  electRow = 320; 
2db70 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f   /* 4 billion ro
2db80 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70  ws */.  }.  comp
2db90 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
2dba0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
2dbb0 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
2dbc0 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e  mit==0 && sSort.
2dbd0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
2dbe0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2dbf0 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28  dbeChangeOpcode(
2dc00 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
2dc10 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65  tIndex, OP_Sorte
2dc20 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72  rOpen);.    sSor
2dc30 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53  t.sortFlags |= S
2dc40 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
2dc50 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
2dc60 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  n an ephemeral i
2dc70 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
2dc80 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
2dc90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
2dca0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
2dcb0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44  stinct ){.    sD
2dcc0 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20  istinct.tabTnct 
2dcd0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2dce0 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
2dcf0 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74  addrTnct = sqlit
2dd00 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2dd10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2dd20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2dd40 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
2dd50 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd70 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49       (char*)keyI
2dd80 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2dd90 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
2dda0 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20  t,0,0),.        
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
2ddd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2dde0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
2ddf0 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
2de00 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2de10 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
2de20 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
2de30 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
2de40 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2de50 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
2de60 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  INCT_NOOP;.  }..
2de70 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
2de80 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
2de90 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61     /* No aggrega
2dea0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
2deb0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
2dec0 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77  use */.    u16 w
2ded0 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69  ctrlFlags = (sDi
2dee0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20  stinct.isTnct ? 
2def0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
2df00 4e 43 54 20 3a 20 30 29 3b 0a 20 20 20 20 61 73  NCT : 0);.    as
2df10 73 65 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f  sert( WHERE_USE_
2df20 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c  LIMIT==SF_FixedL
2df30 69 6d 69 74 20 29 3b 0a 20 20 20 20 77 63 74 72  imit );.    wctr
2df40 6c 46 6c 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c  lFlags |= p->sel
2df50 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65 64  Flags & SF_Fixed
2df60 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 42  Limit;..    /* B
2df70 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
2df80 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70  e scan. */.    p
2df90 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
2dfa0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
2dfb0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
2dfc0 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  re, sSort.pOrder
2dfd0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
2dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dff0 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63     p->pEList, wc
2e000 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65  trlFlags, p->nSe
2e010 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66  lectRow);.    if
2e020 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
2e030 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2e040 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2e050 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e  ereOutputRowCoun
2e060 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e  t(pWInfo) < p->n
2e070 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20  SelectRow ){.   
2e080 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
2e090 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
2e0a0 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
2e0b0 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Info);.    }.   
2e0c0 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69   if( sDistinct.i
2e0d0 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33  sTnct && sqlite3
2e0e0 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
2e0f0 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20  pWInfo) ){.     
2e100 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2e110 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68  Type = sqlite3Wh
2e120 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
2e130 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Info);.    }.   
2e140 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
2e150 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f  rBy ){.      sSo
2e160 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69  rt.nOBSat = sqli
2e170 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
2e180 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2e190 20 73 53 6f 72 74 2e 62 4f 72 64 65 72 65 64 49   sSort.bOrderedI
2e1a0 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  nnerLoop = sqlit
2e1b0 65 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e  e3WhereOrderedIn
2e1c0 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66 6f 29 3b  nerLoop(pWInfo);
2e1d0 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74  .      if( sSort
2e1e0 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70  .nOBSat==sSort.p
2e1f0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
2e200 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e  {.        sSort.
2e210 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2e220 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2e230 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
2e240 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
2e250 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
2e260 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2e270 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
2e280 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
2e290 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
2e2a0 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
2e2b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2e2c0 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
2e2d0 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
2e2e0 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61  .    if( sSort.a
2e2f0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
2e300 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  && sSort.pOrderB
2e310 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
2e320 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
2e330 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
2e340 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
2e350 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
2e360 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
2e370 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20  ner loop. */.   
2e380 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2e390 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
2e3a0 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20  st, -1, &sSort, 
2e3b0 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
2e3c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2e3d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2e3e0 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
2e3f0 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  (pWInfo),.      
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2e410 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
2e420 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a  abel(pWInfo));..
2e430 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
2e440 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
2e450 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
2e460 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2e470 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
2e480 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
2e490 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   when there exis
2e4a0 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
2e4b0 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50  tions or a GROUP
2e4c0 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a   BY clause.    *
2e4d0 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20  * or both */.   
2e4e0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
2e4f0 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
2e500 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
2e510 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
2e520 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
2e530 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
2e540 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
2e550 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
2e560 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
2e570 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
2e580 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
2e590 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
2e5a0 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
2e5b0 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
2e5c0 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
2e5d0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
2e5e0 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
2e5f0 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
2e600 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
2e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e620 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
2e630 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
2e640 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
2e650 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
2e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e670 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
2e680 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
2e690 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
2e6a0 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
2e6b0 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
2e6c0 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
2e6d0 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
2e6e0 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
2e6f0 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
2e700 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
2e710 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
2e720 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
2e730 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
2e740 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
2e750 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  T */.    int sor
2e760 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  tPTab = 0;   /* 
2e770 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64  Pseudotable used
2e780 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69   to decode sorti
2e790 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ng results */.  
2e7a0 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20    int sortOut = 
2e7b0 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  0;    /* Output 
2e7c0 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68  register from th
2e7d0 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
2e7e0 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d  int orderByGrp =
2e7f0 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74   0; /* True if t
2e800 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  he GROUP BY and 
2e810 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68 65  ORDER BY are the
2e820 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   same */..    /*
2e830 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
2e840 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
2e850 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
2e860 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
2e870 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
2e880 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2e890 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
2e8a0 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2e8d0 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
2e8e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2e8f0 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
2e900 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
2e910 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
2e920 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
2e930 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
2e940 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
2e950 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
2e960 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2e970 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
2e980 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
2e990 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
2e9a0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
2e9b0 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
2e9c0 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
2e9d0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
2e9e0 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
2e9f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2ea00 20 20 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d      assert( 66==
2ea10 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
2ea20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
2ea30 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36  p->nSelectRow>66
2ea40 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
2ea50 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65   = 66;.    }else
2ea60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ea70 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
2ea80 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  (1) );.      p->
2ea90 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
2eaa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2eab0 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
2eac0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
2ead0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2eae0 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
2eaf0 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20    ** identical, 
2eb00 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70  then it may be p
2eb10 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62  ossible to disab
2eb20 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  le the ORDER BY 
2eb30 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f  clause .    ** o
2eb40 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68  n the grounds th
2eb50 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  at the GROUP BY 
2eb60 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
2eb70 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
2eb80 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63  .    ** in the c
2eb90 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74  orrect order. It
2eba0 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20   also may not - 
2ebb0 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67  the GROUP BY mig
2ebc0 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20  ht use a.    ** 
2ebd0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 74  database index t
2ebe0 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20  hat causes rows 
2ebf0 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f  to be grouped to
2ec00 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69 72  gether as requir
2ec10 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f  ed.    ** but no
2ec20 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65  t actually sorte
2ec30 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 72  d. Either way, r
2ec40 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
2ec50 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f  hat the.    ** O
2ec60 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55  RDER BY and GROU
2ec70 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65  P BY clauses are
2ec80 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65 74   the same by set
2ec90 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79  ting the orderBy
2eca0 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  Grp.    ** varia
2ecb0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ble.  */.    if(
2ecc0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2ecd0 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79  Compare(pGroupBy
2ece0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2ecf0 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
2ed00 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31    orderByGrp = 1
2ed10 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
2ed20 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
2ed30 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
2ed40 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
2ed50 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2ed60 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
2ed70 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2ed80 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
2ed90 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
2eda0 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
2edb0 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
2edc0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
2edd0 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
2ede0 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
2edf0 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
2ee00 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
2ee10 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
2ee20 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
2ee30 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
2ee40 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
2ee50 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
2ee60 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
2ee70 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
2ee80 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
2ee90 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
2eea0 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
2eeb0 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73  fo.mnReg = pPars
2eec0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73  e->nMem+1;.    s
2eed0 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
2eee0 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
2eef0 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
2ef00 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  xpr : 0;.    sAg
2ef10 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
2ef20 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
2ef30 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2ef40 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
2ef50 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
2ef60 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2ef70 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72  gList(&sNC, sSor
2ef80 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  t.pOrderBy);.   
2ef90 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
2efa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2efb0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2efc0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
2efd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
2efe0 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
2eff0 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
2f000 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
2f010 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2f020 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
2f030 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2f040 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
2f050 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
2f060 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2f070 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
2f080 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
2f090 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
2f0a0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2f0b0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
2f0c0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
2f0d0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
2f0e0 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
2f0f0 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
2f100 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
2f110 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
2f120 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2f130 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2f140 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
2f150 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
2f160 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
2f170 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
2f180 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
2f190 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
2f1a0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
2f1b0 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
2f1c0 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
2f1d0 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
2f1e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
2f1f0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
2f200 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
2f210 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
2f220 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
2f230 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
2f240 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2f250 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r1;          /* 
2f260 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
2f270 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
2f280 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
2f290 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
2f2a0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2f2b0 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
2f2c0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
2f2d0 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
2f2e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
2f2f0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
2f300 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
2f310 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
2f320 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
2f330 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
2f340 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
2f350 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
2f360 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
2f370 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
2f380 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
2f390 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
2f3a0 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
2f3b0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
2f3c0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2f3d0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
2f3e0 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
2f3f0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
2f400 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
2f410 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
2f420 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
2f430 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
2f440 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
2f450 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
2f460 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
2f470 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
2f480 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
2f490 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
2f4a0 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
2f4b0 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
2f4c0 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
2f4d0 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
2f4e0 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
2f4f0 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
2f500 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
2f510 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
2f520 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
2f530 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
2f540 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
2f550 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
2f560 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
2f570 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
2f580 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2f590 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
2f5a0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
2f5b0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
2f5c0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2f5d0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  se, pGroupBy, 0,
2f5e0 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
2f5f0 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  n);.      addrSo
2f600 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
2f610 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2f620 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a  OP_SorterOpen, .
2f630 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
2f640 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
2f650 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
2f660 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
2f670 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
2f680 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2f690 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  O);..      /* In
2f6a0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
2f6b0 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
2f6c0 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
2f6d0 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
2f6e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2f6f0 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  UseFlag = ++pPar
2f700 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2f710 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70  iAbortFlag = ++p
2f720 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2f730 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
2f740 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2f750 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
2f760 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
2f770 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2f780 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20  .      regReset 
2f790 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2f7a0 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65  ;.      addrRese
2f7b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
2f7c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2f7d0 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
2f7e0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
2f7f0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
2f800 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
2f810 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
2f820 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
2f830 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
2f840 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
2f850 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
2f860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f870 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2f880 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
2f890 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2f8a0 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61  ent((v, "clear a
2f8b0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
2f8c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f8d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2f8e0 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  ger, 0, iUseFlag
2f8f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2f900 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
2f910 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
2f920 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
2f930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2f940 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
2f950 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72  iAMem, iAMem+pGr
2f960 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
2f970 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
2f980 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
2f990 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
2f9a0 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
2f9b0 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
2f9c0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
2f9d0 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
2f9e0 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
2f9f0 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
2fa00 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
2fa10 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
2fa20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
2fa30 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
2fa40 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
2fa50 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
2fa60 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
2fa70 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
2fa80 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
2fa90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2faa0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2fab0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
2fac0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
2fad0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
2fae0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
2faf0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
2fb00 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20  , pGroupBy, 0,. 
2fb10 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47           WHERE_G
2fb20 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42  ROUPBY | (orderB
2fb30 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52  yGrp ? WHERE_SOR
2fb40 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30  TBYGROUP : 0), 0
2fb50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
2fb60 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
2fb70 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2fb80 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2fb90 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
2fba0 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70  (pWInfo)==pGroup
2fbb0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
2fbc0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
2fbd0 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
2fbe0 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
2fbf0 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
2fc00 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
2fc10 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
2fc20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
2fc30 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
2fc40 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
2fc50 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
2fc60 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
2fc70 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
2fc80 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
2fc90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fca0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2fcb0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2fcc0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
2fcd0 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
2fce0 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
2fcf0 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
2fd00 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
2fd10 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
2fd20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
2fd30 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
2fd40 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
2fd50 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
2fd60 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
2fd70 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
2fd80 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
2fd90 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
2fda0 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
2fdb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2fdc0 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
2fdd0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
2fde0 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
2fdf0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
2fe00 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
2fe10 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70       explainTemp
2fe20 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20  Table(pParse, . 
2fe30 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73             (sDis
2fe40 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
2fe50 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  (p->selFlags&SF_
2fe60 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a  Distinct)==0) ?.
2fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe80 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a      "DISTINCT" :
2fe90 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20   "GROUP BY");.. 
2fea0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
2feb0 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
2fec0 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
2fed0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2fee0 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
2fef0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  pBy;.        j =
2ff00 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
2ff10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
2ff20 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
2ff30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2ff40 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
2ff50 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
2ff60 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
2ff70 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
2ff80 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
2ff90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ffa0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
2ffb0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
2ffc0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2ffd0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2ffe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2fff0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
30000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
30010 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
30020 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
30030 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29  , regBase, 0, 0)
30040 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
30050 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
30060 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
30070 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
30080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
30090 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
300a0 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
300b0 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
300c0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
300d0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
300e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
300f0 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
30100 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
30110 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
30120 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70  GetColumnToReg(p
30130 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
30140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30150 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
30160 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
30170 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
30180 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
30190 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
301a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
301b0 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
301c0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
301d0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
301e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
301f0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
30200 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
30210 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
30220 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30230 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
30240 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
30250 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
30260 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
30270 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30280 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
30290 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
302a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
302b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
302c0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
302d0 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
302e0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
302f0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
30300 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
30310 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f  tingIdxPTab = so
30320 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d  rtPTab = pParse-
30330 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
30340 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74   sortOut = sqlit
30350 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
30360 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
30370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
30380 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
30390 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74  , sortPTab, sort
303a0 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  Out, nCol);.    
303b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
303c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
303d0 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  erSort, sAggInfo
303e0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
303f0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
30400 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
30410 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
30420 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
30430 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
30440 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
30450 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  x = 1;.        s
30460 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
30470 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20  lear(pParse);.. 
30480 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
30490 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72   If the index or
304a0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
304b0 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f   used by the GRO
304c0 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20  UP BY sort.     
304d0 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c   ** will natural
304e0 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  ly deliver rows 
304f0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71  in the order req
30500 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44  uired by the ORD
30510 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63  ER BY.      ** c
30520 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68  lause, cancel th
30530 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
30540 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72  e open coded ear
30550 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lier..      **. 
30560 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
30570 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
30580 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  - the correct an
30590 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75  swer should resu
305a0 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  lt regardless.. 
305b0 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20       ** Use the 
305c0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
305d0 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
305e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
305f0 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20  TIMIZER to .    
30600 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69    ** disable thi
30610 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
30620 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
30630 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ses.  */.      i
30640 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26  f( orderByGrp &&
30650 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
30660 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
30670 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20  GroupByOrder) . 
30680 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42        && (groupB
30690 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33  ySort || sqlite3
306a0 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57  WhereIsSorted(pW
306b0 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a  Info)).      ){.
306c0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f          sSort.pO
306d0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
306e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
306f0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
30700 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
30710 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
30720 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
30730 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
30740 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
30750 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
30760 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
30770 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
30780 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
30790 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
307a0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
307b0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
307c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
307d0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
307e0 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
307f0 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
30800 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
30810 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
30820 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
30830 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
30840 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
30850 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
30860 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
30870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30880 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
30890 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
308a0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
308b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
308c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
308d0 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
308e0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
308f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30900 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74              sort
30910 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a  Out, sortPTab);.
30920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
30930 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
30940 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
30950 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
30960 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
30970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30980 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
30990 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
309a0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
309b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
309c0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
309d0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
309e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
309f0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
30a00 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
30a10 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
30a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30a30 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
30a40 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
30a50 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
30a60 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
30a70 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
30a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a90 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
30aa0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
30ab0 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
30ac0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
30ad0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
30ae0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
30af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30b00 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
30b10 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72  addr1+1, 0, addr
30b20 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
30b30 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge(v);..      /*
30b40 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
30b50 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
30b60 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
30b70 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
30b80 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
30b90 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
30ba0 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
30bb0 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
30bc0 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
30bd0 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
30be0 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
30bf0 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
30c00 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
30c10 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
30c20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
30c30 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
30c40 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
30c50 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
30c60 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
30c70 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
30c80 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
30c90 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
30ca0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
30cb0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
30cc0 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
30cd0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
30ce0 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
30cf0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
30d00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
30d10 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
30d20 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
30d30 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
30d40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30d50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
30d60 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
30d70 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
30d80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
30d90 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
30da0 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
30db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30dc0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
30dd0 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
30de0 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  rEnd); VdbeCover
30df0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
30e00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
30e10 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
30e20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
30e30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
30e40 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
30e50 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
30e60 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
30e70 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
30e80 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
30e90 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
30ea0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
30eb0 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
30ec0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
30ed0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
30ee0 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
30ef0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
30f00 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
30f10 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64  ddr1);.      upd
30f20 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
30f30 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
30f40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30f50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
30f60 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
30f70 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
30f80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
30f90 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
30fa0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
30fb0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
30fc0 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
30fd0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
30fe0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
30ff0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31000 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
31010 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
31020 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
31030 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
31040 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
31050 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
31060 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
31070 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
31080 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
31090 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
310a0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
310b0 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
310c0 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
310d0 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
310e0 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
310f0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
31100 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
31110 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
31120 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
31130 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
31140 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
31150 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
31160 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
31170 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
31180 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
31190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
311a0 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  oto(v, addrEnd);
311b0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
311c0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
311d0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
311e0 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
311f0 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
31200 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
31210 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
31220 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
31230 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
31240 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
31250 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
31260 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
31270 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
31280 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
31290 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
312a0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
312b0 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
312c0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
312d0 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
312e0 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
312f0 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
31300 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
31310 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
31320 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
31330 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
31340 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
31350 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
31360 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
31370 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
31380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31390 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
313a0 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  er, 1, iAbortFla
313b0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
313c0 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61  mment((v, "set a
313d0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
313e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
313f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
31400 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
31410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31420 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
31430 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  (v, addrOutputRo
31440 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  w);.      addrOu
31450 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
31460 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
31470 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
31480 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31490 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c  OP_IfPos, iUseFl
314a0 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
314b0 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
314c0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
314d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
314e0 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
314f0 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
31500 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
31510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31520 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
31530 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
31540 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
31550 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
31560 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
31570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
31580 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
31590 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
315a0 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
315b0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
315c0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
315d0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
315e0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p->pEList, -1, 
315f0 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20  &sSort,.        
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
31610 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
31620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31630 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
31640 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
31650 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
31660 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
31670 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
31680 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
31690 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
316a0 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
316b0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
316c0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
316d0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
316e0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
316f0 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
31700 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
31710 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
31720 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
31730 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
31740 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
31750 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
31760 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
31770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31780 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
31790 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
317a0 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
317b0 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
317c0 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
317d0 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
317e0 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
317f0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
31800 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
31810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31820 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
31830 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
31840 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
31850 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
31860 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
31870 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
31880 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
31890 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
318a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
318b0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
318c0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
318d0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
318e0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
318f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31900 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
31910 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
31920 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
31930 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
31940 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
31950 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
31960 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
31970 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
31980 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
31990 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
319a0 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
319b0 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
319c0 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
319d0 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
319e0 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
319f0 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
31a00 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
31a10 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
31a20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
31a30 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
31a40 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
31a50 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
31a60 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
31a70 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
31a80 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
31a90 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
31aa0 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
31ab0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
31ac0 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
31ad0 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
31ae0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
31af0 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
31b00 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
31b10 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
31b20 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
31b30 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
31b40 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
31b50 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
31b60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
31b70 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
31b80 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
31b90 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
31ba0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
31bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bc0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
31bd0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
31be0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
31bf0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
31c00 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
31c10 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
31c20 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
31c30 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
31c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c50 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
31c60 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
31c70 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
31c80 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
31c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31ca0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
31cb0 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
31cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
31cd0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
31ce0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
31cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
31d00 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
31d10 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
31d20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
31d30 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
31d40 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
31d50 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
31d60 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e  owest scan cost.
31d70 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31d80 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
31d90 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
31da0 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
31db0 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
31dc0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31dd0 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d      ** (2013-10-
31de0 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74  03) Do not count
31df0 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20   the entries in 
31e00 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
31e10 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31e20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
31e30 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
31e40 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
31e50 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
31e60 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
31e70 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
31e80 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
31e90 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
31ea0 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
31eb0 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65  owid(pTab) ) pBe
31ec0 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  st = sqlite3Prim
31ed0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
31ee0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
31ef0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
31f00 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
31f10 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
31f20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
31f30 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
31f40 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
31f50 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
31f60 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20  szTabRow.       
31f70 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61      && pIdx->pPa
31f80 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20  rtIdxWhere==0.  
31f90 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42           && (!pB
31fa0 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49  est || pIdx->szI
31fb0 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49  dxRow<pBest->szI
31fc0 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  dxRow).         
31fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31fe0 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
31ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32000 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
32010 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pBest ){.       
32020 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
32030 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
32040 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
32050 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
32060 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  ex(pParse, pBest
32070 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
32080 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
32090 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
320a0 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
320b0 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
320c0 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
320d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
320e0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
320f0 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
32100 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a  iRoot, iDb, 1);.
32110 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
32120 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
32130 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
32140 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
32150 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
32160 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
32170 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
32180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
32190 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
321a0 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
321b0 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
321c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
321d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
321e0 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
321f0 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43    explainSimpleC
32200 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  ount(pParse, pTa
32210 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  b, pBest);.     
32220 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
32230 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
32240 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
32250 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
32260 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
32270 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
32280 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
32290 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
322a0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
322b0 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
322c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
322d0 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
322e0 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
322f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
32300 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
32310 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
32320 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
32330 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
32340 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
32350 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
32360 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
32370 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
32380 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
32390 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
323a0 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
323b0 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
323c0 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
323d0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
323e0 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
323f0 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
32400 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
32410 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
32420 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
32430 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
32440 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
32450 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
32460 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
32470 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
32480 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
32490 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
324a0 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
324b0 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
324c0 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
324d0 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
324e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
324f0 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
32500 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
32510 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
32520 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
32530 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
32540 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f  y behavior as fo
32550 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
32560 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
32570 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
32580 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
32590 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
325a0 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
325b0 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
325c0 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
325d0 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
325e0 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
325f0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
32600 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
32610 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
32620 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
32630 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
32640 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
32650 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
32660 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
32670 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
32680 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
32690 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
326a0 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
326b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
326c0 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
326d0 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
326e0 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
326f0 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
32700 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
32710 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
32720 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
32730 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
32740 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32750 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
32760 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
32770 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52    u8 flag = WHER
32780 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
32790 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
327a0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
327b0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
327c0 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
327d0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
327e0 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  if( p->pHaving==
327f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
32800 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
32810 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d  y(&sAggInfo, &pM
32820 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20  inMax);.        
32830 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
32840 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d  ( flag==0 || (pM
32850 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e  inMax!=0 && pMin
32860 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29  Max->nExpr==1) )
32870 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ;..        if( f
32880 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
32890 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
328a0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
328b0 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20  , pMinMax, 0);. 
328c0 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
328d0 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
328e0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
328f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
32900 4d 69 6e 4d 61 78 21 3d 30 20 29 3b 0a 20 20 20  MinMax!=0 );.   
32910 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
32920 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
32930 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
32940 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
32950 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
32960 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31  E_ORDERBY_MIN ?1
32970 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0;.            
32980 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45  pMinMax->a[0].pE
32990 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
329a0 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UMN;.          }
329b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
329c0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
329d0 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
329e0 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
329f0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
32a00 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
32a10 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d   processing is m
32a20 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63  uch simpler sinc
32a30 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  e there is only 
32a40 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20  a single row.   
32a50 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
32a60 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
32a70 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
32a80 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
32a90 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
32aa0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
32ab0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
32ac0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
32ad0 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c  pWhere, pMinMax,
32ae0 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20  0,flag,0);.     
32af0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
32b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
32b10 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
32b20 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
32b30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
32b40 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
32b50 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61    }.        upda
32b60 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
32b70 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
32b80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
32b90 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20  ( pMinMax==0 || 
32ba0 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d  pMinMax->nExpr==
32bb0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
32bc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
32bd0 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30  rdered(pWInfo)>0
32be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
32bf0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
32c00 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
32c10 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
32c20 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
32c30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
32c40 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20  ) by index",.   
32c50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
32c60 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
32c70 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
32c80 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ")));.        }.
32c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
32ca0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
32cb0 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  .        finaliz
32cc0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
32cd0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
32ce0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32cf0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
32d00 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
32d10 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
32d20 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
32d30 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
32d40 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
32d50 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
32d60 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
32d70 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30  pEList, -1, 0, 0
32d80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
32d90 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20           pDest, 
32da0 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
32db0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32dc0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
32dd0 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a  b, pDel);.    }.
32de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
32df0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
32e00 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20  ddrEnd);.    .  
32e10 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65  } /* endif aggre
32e20 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20  gate query */.. 
32e30 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65   if( sDistinct.e
32e40 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
32e50 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
32e60 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  ED ){.    explai
32e70 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
32e80 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a  e, "DISTINCT");.
32e90 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
32ea0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
32eb0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77  Y clause, then w
32ec0 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74  e need to sort t
32ed0 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
32ee0 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f  and send them to
32ef0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
32f00 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  e by one..  */. 
32f10 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
32f20 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  rBy ){.    expla
32f30 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
32f40 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
32f50 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 6e           sSort.n
32f60 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54  OBSat>0 ? "RIGHT
32f70 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42   PART OF ORDER B
32f80 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a  Y":"ORDER BY");.
32f90 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
32fa0 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
32fb0 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e  &sSort, pEList->
32fc0 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20  nExpr, pDest);. 
32fd0 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65   }..  /* Jump he
32fe0 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
32ff0 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
33000 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
33010 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
33020 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
33030 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20  has been coded. 
33040 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  If there is an e
33050 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73  rror in the Pars
33060 65 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a  e structure,.  *
33070 2a 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e  * set the return
33080 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65   code to 1. Othe
33090 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63  rwise 0. */.  rc
330a0 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72   = (pParse->nErr
330b0 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  >0);..  /* Contr
330c0 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
330d0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
330e0 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
330f0 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
33100 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
33110 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
33120 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
33130 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  :.  explainSetIn
33140 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
33150 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
33160 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f  eSelectId);..  /
33170 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
33180 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c  n names if resul
33190 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
331a0 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75   are to be outpu
331b0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
331c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
331d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
331e0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
331f0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
33200 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
33210 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
33220 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  }..  sqlite3DbFr
33230 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
33240 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
33250 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
33260 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20  nfo.aFunc);.#if 
33270 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
33280 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43  LED.  SELECTTRAC
33290 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
332a0 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  nd processing\n"
332b0 29 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53  ));.  pParse->nS
332c0 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23  electIndent--;.#
332d0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
332e0 63 3b 0a 7d 0a                                   c;.}.