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

Artifact bebe7cce45d899d2237c76bce059d525abf5b861f2fce92f6b53914a961c01ba:


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 69 66  >pLimit);.    if
0ad0: 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
0ae0: 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20 29 20  RUE(p->pWith) ) 
0af0: 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
0b00: 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  e(db, p->pWith);
0b10: 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
0b20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
0b30: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d  (db, p);.    p =
0b40: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62 46 72   pPrior;.    bFr
0b50: 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ee = 1;.  }.}../
0b60: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0b70: 61 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  a SelectDest str
0b80: 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
0b90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
0ba0: 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74  tInit(SelectDest
0bb0: 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65   *pDest, int eDe
0bc0: 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
0bd0: 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d    pDest->eDest =
0be0: 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44   (u8)eDest;.  pD
0bf0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69  est->iSDParm = i
0c00: 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 7a  Parm;.  pDest->z
0c10: 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  AffSdst = 0;.  p
0c20: 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b  Dest->iSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
0c40: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
0c50: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
0c60: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
0c70: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
0c80: 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73  ter to that.** s
0c90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c  tructure..*/.Sel
0ca0: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
0cb0: 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65 20 2a  ctNew(.  Parse *
0cc0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
0cd0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0ce0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
0cf0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20  *pEList,     /* 
0d00: 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f  which columns to
0d10: 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65 20   include in the 
0d20: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c  result */.  SrcL
0d30: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
0d40: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
0d50: 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74 61  ause -- which ta
0d60: 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  bles to scan */.
0d70: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
0d80: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
0d90: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
0da0: 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
0db0: 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47 52  pBy,   /* the GR
0dc0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
0dd0: 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
0de0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0df0: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f  HAVING clause */
0e00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0e10: 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  derBy,   /* the 
0e20: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
0e30: 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c 61 67  */.  u32 selFlag
0e40: 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s,         /* Fl
0e50: 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c 20 73  ag parameters, s
0e60: 75 63 68 20 61 73 20 53 46 5f 44 69 73 74 69 6e  uch as SF_Distin
0e70: 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  ct */.  Expr *pL
0e80: 69 6d 69 74 20 20 20 20 20 20 20 20 20 20 2f 2a  imit          /*
0e90: 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e   LIMIT value.  N
0ea0: 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73  ULL means not us
0eb0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ed */.){.  Selec
0ec0: 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
0ed0: 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70 4e 65  t standin;.  pNe
0ee0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
0ef0: 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d  locRawNN(pParse-
0f00: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  >db, sizeof(*pNe
0f10: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
0f20: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
0f30: 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
0f40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
0f50: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0f60: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  in;.  }.  if( pE
0f70: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
0f80: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
0f90: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
0fa0: 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
0fd0: 74 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e  te3Expr(pParse->
0fe0: 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b 2c 30  db,TK_ASTERISK,0
0ff0: 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  ));.  }.  pNew->
1000: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
1010: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
1020: 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d  _SELECT;.  pNew-
1030: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c 46  >selFlags = selF
1040: 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  lags;.  pNew->iL
1050: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
1060: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 23  ->iOffset = 0;.#
1070: 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
1080: 4e 41 42 4c 45 44 0a 20 20 70 4e 65 77 2d 3e 7a  NABLED.  pNew->z
1090: 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  SelName[0] = 0;.
10a0: 23 65 6e 64 69 66 0a 20 20 70 4e 65 77 2d 3e 61  #endif.  pNew->a
10b0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
10c0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
10d0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
10e0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65  1;.  pNew->nSele
10f0: 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28  ctRow = 0;.  if(
1100: 20 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20   pSrc==0 ) pSrc 
1110: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1120: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
1130: 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  , sizeof(*pSrc))
1140: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
1150: 20 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70   pSrc;.  pNew->p
1160: 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
1170: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
1180: 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70   = pGroupBy;.  p
1190: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  New->pHaving = p
11a0: 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e  Having;.  pNew->
11b0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
11c0: 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  rBy;.  pNew->pPr
11d0: 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ior = 0;.  pNew-
11e0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e  >pNext = 0;.  pN
11f0: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69  ew->pLimit = pLi
1200: 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69  mit;.  pNew->pWi
1210: 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  th = 0;.  if( pP
1220: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1230: 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63  Failed ) {.    c
1240: 6c 65 61 72 53 65 6c 65 63 74 28 70 50 61 72 73  learSelect(pPars
1250: 65 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  e->db, pNew, pNe
1260: 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20  w!=&standin);.  
1270: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65    pNew = 0;.  }e
1280: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
1290: 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c   pNew->pSrc!=0 |
12a0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
12b0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
12c0: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
12d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   );.  return pNe
12e0: 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54  w;.}..#if SELECT
12f0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
1300: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
1310: 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a   of a Select obj
1320: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
1330: 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
1340: 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73  (Select *p, cons
1350: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1360: 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65    if( p && zName
1370: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1380: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1390: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d  p->zSelName), p-
13a0: 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c  >zSelName, "%s",
13b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23   zName);.  }.}.#
13c0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
13d0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
13e0: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
13f0: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
1400: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
1410: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
1420: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
1430: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
1440: 29 7b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41  ){.  if( OK_IF_A
1450: 4c 57 41 59 53 5f 54 52 55 45 28 70 29 20 29 20  LWAYS_TRUE(p) ) 
1460: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
1470: 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 1);.}../*.** 
1480: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1490: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
14a0: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
14b0: 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  ent in a compoun
14c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c  d..*/.static Sel
14d0: 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f  ect *findRightmo
14e0: 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  st(Select *p){. 
14f0: 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74   while( p->pNext
1500: 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   ) p = p->pNext;
1510: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1520: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f  /*.** Given 1 to
1530: 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70   3 identifiers p
1540: 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  receding the JOI
1550: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
1560: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
1570: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
1580: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
1590: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
15a0: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
15b0: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
15c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
15d0: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
15e0: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
15f0: 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20    JT_CROSS.**   
1600: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
1610: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
1620: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
1630: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
1640: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
1650: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
1660: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
1670: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
1680: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
1690: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
16a0: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
16b0: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
16c0: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
16d0: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
16e0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
16f0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1700: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1710: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
1720: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1730: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
1740: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
1750: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1760: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
1770: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20  .  Token *p;.   
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 30            /*   0
17a0: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
17b0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
17c0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
17d0: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65 78  nst char zKeyTex
17e0: 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65 66  t[] = "naturalef
17f0: 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69 6e  touterightfullin
1800: 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74 61  nercross";.  sta
1810: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
1820: 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20 20   {.    u8 i;    
1830: 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
1840: 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78 74   of keyword text
1850: 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a   in zKeyText[] *
1860: 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 20  /.    u8 nChar; 
1870: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
1880: 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20 63  the keyword in c
1890: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20  haracters */.   
18a0: 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a   u8 code;     /*
18b0: 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b 20   Join type mask 
18c0: 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b  */.  } aKeyword[
18d0: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74  ] = {.    /* nat
18e0: 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c  ural */ { 0,  7,
18f0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20 20   JT_NATURAL     
1900: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1910: 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20    /* left    */ 
1920: 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54  { 6,  4, JT_LEFT
1930: 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20  |JT_OUTER       
1940: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74     },.    /* out
1950: 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c  er   */ { 10, 5,
1960: 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20   JT_OUTER       
1970: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1980: 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f 20    /* right   */ 
1990: 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48  { 14, 5, JT_RIGH
19a0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
19b0: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c     },.    /* ful
19c0: 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c  l    */ { 19, 4,
19d0: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48   JT_LEFT|JT_RIGH
19e0: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
19f0: 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20    /* inner   */ 
1a00: 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45  { 23, 5, JT_INNE
1a10: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1a20: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f     },.    /* cro
1a30: 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c  ss   */ { 28, 5,
1a40: 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f   JT_INNER|JT_CRO
1a50: 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  SS         },.  
1a60: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  };.  int i, j;. 
1a70: 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a   apAll[0] = pA;.
1a80: 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b    apAll[1] = pB;
1a90: 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43  .  apAll[2] = pC
1aa0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
1ab0: 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b   && apAll[i]; i+
1ac0: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c  +){.    p = apAl
1ad0: 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  l[i];.    for(j=
1ae0: 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61  0; j<ArraySize(a
1af0: 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a  Keyword); j++){.
1b00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
1b10: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61  aKeyword[j].nCha
1b20: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
1b30: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1b40: 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b  (char*)p->z, &zK
1b50: 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b  eyText[aKeyword[
1b60: 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20  j].i], p->n)==0 
1b70: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
1b80: 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b  ype |= aKeyword[
1b90: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
1ba0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1bb0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
1bc0: 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31  se( j==0 || j==1
1bd0: 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33   || j==2 || j==3
1be0: 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35   || j==4 || j==5
1bf0: 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20   || j==6 );.    
1c00: 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65  if( j>=ArraySize
1c10: 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20 20  (aKeyword) ){.  
1c20: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1c30: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
1c40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1c50: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
1c60: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
1c70: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
1c80: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1c90: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
1ca0: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
1cb0: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  =0.  ){.    cons
1cc0: 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20  t char *zSp = " 
1cd0: 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ";.    assert( p
1ce0: 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  B!=0 );.    if( 
1cf0: 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20  pC==0 ){ zSp++; 
1d00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
1d10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1d20: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
1d30: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
1d40: 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25 54   ".       "%T %T
1d50: 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a  %s%T", pA, pB, z
1d60: 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  Sp, pC);.    joi
1d70: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1d80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6a  ;.  }else if( (j
1d90: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1da0: 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ER)!=0 .        
1db0: 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26 20   && (jointype & 
1dc0: 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48  (JT_LEFT|JT_RIGH
1dd0: 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a  T))!=JT_LEFT ){.
1de0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1df0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1e00: 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55     "RIGHT and FU
1e10: 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61  LL OUTER JOINs a
1e20: 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  re not currently
1e30: 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
1e40: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1e50: 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  INNER;.  }.  ret
1e60: 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a  urn jointype;.}.
1e70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1e80: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c  e index of a col
1e90: 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20  umn in a table. 
1ea0: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68   Return -1 if th
1eb0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e  e column.** is n
1ec0: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1ed0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
1ee0: 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49  atic int columnI
1ef0: 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62  ndex(Table *pTab
1f00: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
1f10: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
1f20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
1f30: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1f40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1f50: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  Cmp(pTab->aCol[i
1f60: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
1f70: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1f80: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1f90: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
1fa0: 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c 65  he first N table
1fb0: 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20  s in pSrc, from 
1fc0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 6c  left to right, l
1fd0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20  ooking for a.** 
1fe0: 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20 61  table that has a
1ff0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43   column named zC
2000: 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ol.  .**.** When
2010: 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69 54   found, set *piT
2020: 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f  ab and *piCol to
2030: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65 78   the table index
2040: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65   and column inde
2050: 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74 63  x.** of the matc
2060: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  hing column and 
2070: 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a  return TRUE..**.
2080: 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  ** If not found,
2090: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a   return FALSE..*
20a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61 62  /.static int tab
20b0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
20c0: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
20d0: 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  c,       /* Arra
20e0: 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  y of tables to s
20f0: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e  earch */.  int N
2100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2110: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62  /* Number of tab
2120: 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  les in pSrc->a[]
2130: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2140: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2150: 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ,    /* Name of 
2160: 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72  the column we ar
2170: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f  e looking for */
2180: 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20 20  .  int *piTab,  
2190: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
21a0: 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e   index of pSrc->
21b0: 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  a[] here */.  in
21c0: 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20 20  t *piCol        
21d0: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
21e0: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69  x of pSrc->a[*pi
21f0: 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Tab].pTab->aCol[
2200: 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ] here */.){.  i
2210: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2220: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
2230: 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
2240: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2250: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
2260: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2270: 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f  umn matching zCo
2280: 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  l */..  assert( 
2290: 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43  (piTab==0)==(piC
22a0: 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f  ol==0) );  /* Bo
22b0: 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61 72  th or neither ar
22c0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28  e NULL */.  for(
22d0: 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a  i=0; i<N; i++){.
22e0: 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d      iCol = colum
22f0: 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b 69  nIndex(pSrc->a[i
2300: 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20  ].pTab, zCol);. 
2310: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
2320: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54 61  {.      if( piTa
2330: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69  b ){.        *pi
2340: 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Tab = i;.       
2350: 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a   *piCol = iCol;.
2360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2370: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2380: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2390: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
23a0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
23b0: 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69 65  add terms implie
23c0: 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78  d by JOIN syntax
23d0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
23e0: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
23f0: 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  on of a SELECT s
2400: 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65  tatement. The ne
2410: 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a  w term, which.**
2420: 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20 74   is ANDed with t
2430: 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45 52  he existing WHER
2440: 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66 20  E clause, is of 
2450: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
2460: 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20     (tab1.col1 = 
2470: 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a  tab2.col2).**.**
2480: 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20 74   where tab1 is t
2490: 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c 65  he iSrc'th table
24a0: 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63   in SrcList pSrc
24b0: 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68 65   and tab2 is the
24c0: 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74 68   .** (iSrc+1)'th
24d0: 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73  . Column col1 is
24e0: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74   column iColLeft
24f0: 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63 6f   of tab1, and co
2500: 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  l2 is.** column 
2510: 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61 62  iColRight of tab
2520: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
2530: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
2540: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
2570: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
2580: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
2590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
25a0: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 46  t of tables in F
25b0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
25c0: 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20 20  int iLeft,      
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
25f0: 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20  t table to join 
2600: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2610: 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20   iColLeft,      
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2630: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
2640: 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 2a  in first table *
2650: 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c 20  /.  int iRight, 
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2680: 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20  second table in 
2690: 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43  pSrc */.  int iC
26a0: 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  olRight,        
26b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
26c0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
26d0: 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a  second table */.
26e0: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69    int isOuterJoi
26f0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2700: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2710: 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f  s is an OUTER jo
2720: 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  in */.  Expr **p
2730: 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20  pWhere          
2740: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2750: 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  T: The WHERE cla
2760: 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f  use to add to */
2770: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2780: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2790: 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20 45    Expr *pE1;.  E
27a0: 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70 72  xpr *pE2;.  Expr
27b0: 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72 74   *pEq;..  assert
27c0: 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20 29  ( iLeft<iRight )
27d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
27e0: 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29 3b  ->nSrc>iRight );
27f0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
2800: 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20 29  >a[iLeft].pTab )
2810: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2820: 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61 62  ->a[iRight].pTab
2830: 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c   );..  pE1 = sql
2840: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2850: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2860: 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b  Left, iColLeft);
2870: 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65 33  .  pE2 = sqlite3
2880: 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72  CreateColumnExpr
2890: 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67 68  (db, pSrc, iRigh
28a0: 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a  t, iColRight);..
28b0: 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33 50    pEq = sqlite3P
28c0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
28d0: 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a 20  EQ, pE1, pE2);. 
28e0: 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75   if( pEq && isOu
28f0: 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45  terJoin ){.    E
2900: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2910: 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  Eq, EP_FromJoin)
2920: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2930: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2940: 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  Eq, EP_TokenOnly
2950: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2960: 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
2970: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e  operty(pEq, EP_N
2980: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45  oReduce);.    pE
2990: 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  q->iRightJoinTab
29a0: 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69  le = (i16)pE2->i
29b0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70  Table;.  }.  *pp
29c0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
29d0: 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68  xprAnd(db, *ppWh
29e0: 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a  ere, pEq);.}../*
29f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
2a00: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2a10: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
2a20: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
2a30: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
2a40: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
2a50: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
2a60: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
2a70: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
2a80: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
2a90: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
2aa0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
2ab0: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
2ac0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
2ad0: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
2ae0: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
2af0: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
2b00: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
2b10: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
2b20: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
2b30: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
2b40: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2b50: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
2b60: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
2b70: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
2b80: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
2b90: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
2ba0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
2bb0: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
2bc0: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
2bd0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
2be0: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
2bf0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
2c00: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2c10: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
2c20: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
2c30: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
2c40: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c50: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
2c60: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2c70: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
2c80: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
2c90: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
2ca0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
2cb0: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
2cc0: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
2cd0: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
2ce0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
2cf0: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
2d00: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
2d10: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
2d20: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2d30: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
2d40: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
2d50: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
2d60: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
2d70: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
2d80: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
2d90: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
2da0: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
2db0: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
2dc0: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
2dd0: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
2de0: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
2df0: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2e00: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2e10: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2e20: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2e30: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
2e40: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
2e50: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
2e60: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
2e70: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
2e80: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
2e90: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
2ea0: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
2eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
2ec0: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
2ed0: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2ee0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2ef0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2f00: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2f10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2f20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2f30: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2f40: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2f50: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2f60: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
2f70: 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69  uce);.    p->iRi
2f80: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2f90: 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20  i16)iTable;.    
2fa0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  if( p->op==TK_FU
2fb0: 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70  NCTION && p->x.p
2fc0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  List ){.      in
2fd0: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
2fe0: 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74  =0; i<p->x.pList
2ff0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
3000: 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78         setJoinEx
3010: 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  pr(p->x.pList->a
3020: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
3030: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3040: 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70  }.    setJoinExp
3050: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
3060: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
3070: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
3080: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3090: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
30a0: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
30b0: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
30c0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
30d0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
30e0: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
30f0: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
3100: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
3110: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
3120: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
3130: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
3140: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
3150: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
3160: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
3170: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
3180: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
3190: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
31a0: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
31b0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
31c0: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
31d0: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
31e0: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
31f0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
3200: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
3210: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
3220: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
3230: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
3240: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
3250: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
3260: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
3270: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
3280: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
3290: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
32a0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
32b0: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
32c0: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
32d0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
32e0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
32f0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
3300: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
3310: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
3320: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3330: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
3340: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3350: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
3360: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3380: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
3390: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
33a0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
33d0: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
33e0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
33f0: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
3400: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3410: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
3420: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3430: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
3440: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
3450: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
3460: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
3470: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
3480: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
3490: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
34a0: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
34b0: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
34c0: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
34d0: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
34e0: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
34f0: 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65  ;.    int isOute
3500: 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45  r;..    if( NEVE
3510: 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30  R(pLeft->pTab==0
3520: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
3530: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
3540: 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69    isOuter = (pRi
3550: 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  ght->fg.jointype
3560: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b   & JT_OUTER)!=0;
3570: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
3580: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
3590: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
35a0: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
35b0: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
35c0: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
35d0: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
35e0: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
35f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3600: 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74  pRight->fg.joint
3610: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
3620: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
3630: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
3640: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3660: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3670: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3680: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3690: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
36a0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
36b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
36c0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
36d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
36e0: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
36f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3700: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
3710: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
3720: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
3730: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
3740: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
3750: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
3760: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3770: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3780: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3790: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
37a0: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
37b0: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
37c0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
37d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
37e0: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
37f0: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3800: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
3810: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
3820: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3830: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
3840: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
3850: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3870: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3880: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3890: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
38a0: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
38b0: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
38c0: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
38d0: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
38e0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
38f0: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3900: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
3910: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3920: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
3930: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
3940: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
3950: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
3960: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
3970: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3980: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
3990: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
39a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
39b0: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
39c0: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
39d0: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
39e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
39f0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
3a00: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
3a10: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
3a20: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
3a30: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
3a40: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
3a50: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
3a60: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3a70: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
3a80: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
3a90: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
3aa0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3ab0: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
3ac0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3ad0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3ae0: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
3af0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3b00: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
3b10: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
3b20: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
3b30: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
3b40: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
3b50: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
3b60: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
3b70: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
3b80: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3b90: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
3ba0: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
3bb0: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
3bc0: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
3bd0: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
3be0: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
3bf0: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
3c00: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
3c10: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
3c20: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
3c30: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3c40: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3c50: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
3c60: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
3c70: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
3c80: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
3c90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3ca0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
3cb0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3cc0: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
3cd0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3ce0: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3cf0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
3d00: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
3d10: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
3d20: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
3d30: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
3d40: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3d50: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
3d60: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
3d70: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
3d80: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
3d90: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
3da0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
3db0: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
3dc0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3dd0: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
3de0: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
3df0: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
3e00: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
3e10: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
3e20: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
3e30: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
3e40: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
3e50: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
3e60: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
3e70: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
3e80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3e90: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3ea0: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
3eb0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
3ec0: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
3ed0: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
3ee0: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
3ef0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
3f00: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3f10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3f20: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3f30: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
3f40: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
3f50: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
3f80: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
3f90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3fa0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
3fb0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3fc0: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
3fd0: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
3fe0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
3ff0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
4000: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
4010: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
4020: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
4030: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
4040: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
4050: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
4060: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
4070: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
4080: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
4090: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
40a0: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
40b0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
40c0: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
40d0: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
40e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
40f0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
4100: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
4110: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
4120: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
4130: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
4140: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
4150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
4160: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
4170: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4180: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
4190: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
41a0: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
41b0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
41c0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
41d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
41e0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
41f0: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
4200: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
4210: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
4220: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
4230: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
4240: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
4250: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
4260: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
4270: 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46  Data,       /* F
4280: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
4290: 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72  lding data befor
42a0: 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69  e packing */.  i
42b0: 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20  nt nData,       
42c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
42d0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
42e0: 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f  he data array */
42f0: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65  .  int nPrefixRe
4300: 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e  g         /* No.
4310: 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f   of reg prior to
4320: 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62   regData availab
4330: 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b  le for use */.){
4340: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4350: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65      /* Stmt unde
4380: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
4390: 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28  /.  int bSeq = (
43a0: 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67  (pSort->sortFlag
43b0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
43c0: 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69  Sorter)==0);.  i
43d0: 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74  nt nExpr = pSort
43e0: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
43f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
4400: 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20  /* No. of ORDER 
4410: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  BY terms */.  in
4420: 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20  t nBase = nExpr 
4430: 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20  + bSeq + nData; 
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4450: 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74  * Fields in sort
4460: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4470: 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74  /* Regs for sort
44b0: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
44c0: 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b  nt regRecord = +
44d0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72  /* Assembled sor
4500: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4510: 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f  int nOBSat = pSo
4520: 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20  rt->nOBSat;     
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   /* ORDER BY ter
4550: 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ms to skip */.  
4560: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20     /* Opcode to 
4590: 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  add sorter recor
45a0: 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20  d to sorter */. 
45b0: 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20   int iLimit;    
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 4c 49 4d 49 54 20 63 6f 75      /* LIMIT cou
45e0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
45f0: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
4600: 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  eq==1 );.  asser
4610: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
4620: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
4630: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
4640: 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ta==0 );.  if( n
4650: 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20  PrefixReg ){.   
4660: 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78   assert( nPrefix
4670: 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20  Reg==nExpr+bSeq 
4680: 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  );.    regBase =
4690: 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72   regData - nExpr
46a0: 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65   - bSeq;.  }else
46b0: 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  {.    regBase = 
46c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
46d0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
46e0: 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d  em += nBase;.  }
46f0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
4700: 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c  ct->iOffset==0 |
4710: 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  | pSelect->iLimi
4720: 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74  t!=0 );.  iLimit
4730: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
4740: 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69  set ? pSelect->i
4750: 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65  Offset+1 : pSele
4760: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53  ct->iLimit;.  pS
4770: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d  ort->labelDone =
4780: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4790: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69  Label(v);.  sqli
47a0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
47b0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
47c0: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67  t->pOrderBy, reg
47d0: 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74  Base, regOrigDat
47e0: 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a,.             
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
4800: 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28  ITE_ECEL_DUP | (
4810: 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c  regOrigData? SQL
4820: 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30  ITE_ECEL_REF : 0
4830: 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29  ));.  if( bSeq )
4840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
4850: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
4860: 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69  quence, pSort->i
4870: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
4880: 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69  +nExpr);.  }.  i
4890: 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30  f( nPrefixReg==0
48a0: 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20   && nData>0 ){. 
48b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
48c0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
48d0: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
48e0: 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74  nExpr+bSeq, nDat
48f0: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
4900: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4910: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4920: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4930: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4940: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4950: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4960: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4970: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4980: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4990: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
49a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
49b0: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
49c0: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
49d0: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
49e0: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
49f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4a00: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
4a10: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
4a20: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4a30: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4a40: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4a50: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4a60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4a70: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4a80: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4a90: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4aa0: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4ab0: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4ac0: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
4ad0: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
4ae0: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
4af0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
4b00: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
4b10: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
4b20: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4b30: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4b40: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4b50: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4b60: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4b70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4b80: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4b90: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4ba0: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4bb0: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4bc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4bd0: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
4be0: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
4bf0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
4c00: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
4c10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4c20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4c30: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4c40: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4c50: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4c60: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4c70: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4c80: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4c90: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4ca0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4cb0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4cc0: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
4cd0: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
4ce0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
4cf0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
4d00: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
4d10: 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65   0, pKI->nKeyFie
4d20: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
4d30: 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a  _Jump testable *
4d40: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
4d50: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
4d60: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
4d70: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65  KEYINFO);.    te
4d80: 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c  stcase( pKI->nAl
4d90: 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b  lField > pKI->nK
4da0: 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20  eyField+2 );.   
4db0: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4dc0: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4dd0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4de0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4df0: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65      pKI->nAllFie
4e30: 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  ld-pKI->nKeyFiel
4e40: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
4e50: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
4e60: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
4e70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4e80: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
4e90: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
4ea0: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
4eb0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4ec0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
4ed0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
4ee0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
4ef0: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4f00: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
4f10: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
4f20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4f30: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
4f40: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
4f50: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
4f60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f70: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
4f80: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
4f90: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
4fa0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
4fb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4fc0: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
4fd0: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
4fe0: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
4ff0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5000: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5010: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5020: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
5030: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5040: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
5050: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
5060: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
5070: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5080: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5090: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
50a0: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
50b0: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
50c0: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
50d0: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
50e0: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
50f0: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
5100: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
5110: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5120: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
5130: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
5140: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
5150: 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73            regBas
5160: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
5170: 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69  nOBSat);.  if( i
5180: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
5190: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72   addr;.    int r
51a0: 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69  1 = 0;.    /* Fi
51b0: 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e  ll the sorter un
51c0: 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  til it contains 
51d0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
51e0: 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d  ries.  (The iLim
51f0: 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  it.    ** regist
5200: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
5210: 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20  d with value of 
5220: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20  LIMIT+OFFSET.)  
5230: 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72  After the sorter
5240: 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70  .    ** fills up
5250: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61  , delete the lea
5260: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5270: 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63  sorter after eac
5280: 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a  h insert..    **
5290: 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68   Thus we never h
52a0: 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  old more than th
52b0: 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72  e LIMIT+OFFSET r
52c0: 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74  ows in memory at
52d0: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64   once */.    add
52e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
52f0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
5300: 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  tZero, iLimit); 
5310: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5320: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5330: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
5340: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
5350: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
5360: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5370: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5380: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
5390: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
53a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
53b0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
53c0: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
53d0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
53e0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
53f0: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
5400: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5410: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
5420: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
5430: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
5440: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
5450: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
5460: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5470: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5480: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
5490: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
54a0: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
54b0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
54c0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
54d0: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
54e0: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
54f0: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
5500: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
5510: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
5520: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
5530: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
5540: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
5550: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
5560: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5570: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5580: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
5590: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
55a0: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
55b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
55c0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
55d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
55e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
55f0: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
5600: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
5610: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5620: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
5630: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
5640: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5650: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5660: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5670: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5680: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5690: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
56a0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
56b0: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
56c0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
56d0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
56e0: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
56f0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5700: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
5710: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
5720: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
5730: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
5740: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
5750: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
5760: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5770: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5780: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
57a0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
57b0: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
57c0: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
57d0: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
57e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
57f0: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5800: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
5810: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
5820: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
5830: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
5840: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
5850: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
5860: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5870: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5880: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5890: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
58a0: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
58b0: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
58c0: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
58d0: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
58e0: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
58f0: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5900: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
5910: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
5920: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
5930: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
5940: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
5950: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
5960: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5970: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5980: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
5990: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
59a0: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
59b0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
59c0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
59d0: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
59e0: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
59f0: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5a00: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5a10: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5a20: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5a30: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5a40: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5a50: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5a60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5a70: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5a80: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5a90: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5aa0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5ab0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5ac0: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5ad0: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5ae0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5af0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5b00: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5b10: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5b20: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5b30: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5b40: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5b50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5b60: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5b70: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5b80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5b90: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
5ba0: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
5bb0: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
5bc0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5bd0: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
5be0: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
5bf0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5c00: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5c10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5c20: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5c30: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5c40: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5c50: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5c60: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5c70: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
5c80: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
5c90: 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  ->pEList express
5ca0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
5cb0: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
5cc0: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
5cd0: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
5ce0: 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65   srcTab is.** ze
5cf0: 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e  ro or more, then
5d00: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
5d10: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
5d20: 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65  p->pEList is use
5d30: 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65  d only .** to ge
5d40: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
5d50: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
5d60: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
5d70: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
5d80: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
5d90: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
5da0: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
5db0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
5dc0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
5dd0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
5de0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
5df0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
5e00: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
5e10: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
5e20: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
5e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
5e40: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
5e50: 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e  s table if non-n
5e60: 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72  egative */.  Sor
5e70: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
5e80: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
5e90: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
5ea0: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
5eb0: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
5ec0: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
5ed0: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
5ee0: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5ef0: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
5f00: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
5f10: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
5f20: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
5f30: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
5f40: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
5f50: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
5f60: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
5f70: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
5f80: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
5f90: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
5fa0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5fb0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
5fc0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
5fd0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5fe0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5ff0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
6000: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
6010: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6020: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
6030: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
6040: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
6050: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
6060: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
6070: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
6080: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
6090: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
60a0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
60b0: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
60c0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
60d0: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
60e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
60f0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
6100: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
6110: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
6120: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
6130: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
6140: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
6150: 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  */..  /* Usually
6160: 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20 74  , regResult is t
6170: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  he first cell in
6180: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d   an array of mem
6190: 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63  ory cells.  ** c
61a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
61b0: 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77  rrent result row
61c0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
61d0: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
61e0: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
61f0: 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  alue. However, i
6200: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
6210: 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20  e being sent to 
6220: 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a  the sorter, the.
6230: 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20    ** values for 
6240: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20  any expressions 
6250: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61  that are also pa
6260: 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b  rt of the sort-k
6270: 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20  ey are omitted. 
6280: 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72   ** from this ar
6290: 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ray. In this cas
62a0: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
62b0: 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20   to zero.  */.  
62c0: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
62e0: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
62f0: 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72  olding current r
6300: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6310: 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20  regOrig;        
6320: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
6330: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
6340: 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28  ng full result (
6350: 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65  or 0) */..  asse
6360: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
6370: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
6380: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
6390: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
63a0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
63b0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
63c0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
63d0: 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d   pSort && pSort-
63e0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70  >pOrderBy==0 ) p
63f0: 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Sort = 0;.  if( 
6400: 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73  pSort==0 && !has
6410: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
6420: 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75  assert( iContinu
6430: 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65  e!=0 );.    code
6440: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
6450: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6460: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
6470: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
6480: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e  olumns..  */.  n
6490: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70  ResultCol = p->p
64a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
64b0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
64c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
64d0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e  pSort ){.      n
64e0: 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72  PrefixReg = pSor
64f0: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
6500: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28  pr;.      if( !(
6510: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
6520: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
6530: 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78  orter) ) nPrefix
6540: 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Reg++;.      pPa
6550: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72  rse->nMem += nPr
6560: 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20  efixReg;.    }. 
6570: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
6580: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
6590: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
65a0: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
65b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44  ;.  }else if( pD
65c0: 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75  est->iSdst+nResu
65d0: 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e  ltCol > pParse->
65e0: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nMem ){.    /* T
65f0: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20  his is an error 
6600: 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63  condition that c
6610: 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65  an result, for e
6620: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53  xample, when a S
6630: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20  ELECT.    ** on 
6640: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
6650: 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  ide of an INSERT
6660: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72   contains more r
6670: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
6680: 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  an.    ** there 
6690: 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  are columns in t
66a0: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
66b0: 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72  left.  The error
66c0: 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a   will be caught.
66d0: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72      ** and repor
66e0: 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ted later.  But 
66f0: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
6700: 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  sure enough memo
6710: 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a  ry is allocated.
6720: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
6730: 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65  other spurious e
6740: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61  rrors in the mea
6750: 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50  ntime. */.    pP
6760: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
6770: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20  esultCol;.  }.  
6780: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e  pDest->nSdst = n
6790: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67  ResultCol;.  reg
67a0: 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74  Orig = regResult
67b0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
67c0: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
67d0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
67e0: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
67f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6800: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6810: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
6820: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
6830: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
6840: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
6850: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p->pEList->a[i].
6860: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
6870: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6880: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
6890: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
68a0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
68b0: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
68c0: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
68d0: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
68e0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
68f0: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
6900: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
6910: 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67  .    u8 ecelFlag
6920: 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  s;.    if( eDest
6930: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
6940: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6950: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6960: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6970: 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49  ecelFlags = SQLI
6980: 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20  TE_ECEL_DUP;.   
6990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63   }else{.      ec
69a0: 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  elFlags = 0;.   
69b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
69c0: 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d   && hasDistinct=
69d0: 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  =0 && eDest!=SRT
69e0: 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65  _EphemTab && eDe
69f0: 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  st!=SRT_Table ){
6a00: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
6a10: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
6a20: 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20   p->pEList that 
6a30: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  is a copy of an 
6a40: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20  expression in.  
6a50: 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
6a60: 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72   BY clause (pSor
6a70: 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65  t->pOrderBy), se
6a80: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
6a90: 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65   .      ** iOrde
6aa0: 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20  rByCol value to 
6ab0: 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
6ac0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  e index of the O
6ad0: 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a  RDER BY .      *
6ae0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  * expression wit
6af0: 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79  hin the sort-key
6b00: 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f   that pushOntoSo
6b10: 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65  rter() will gene
6b20: 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rate..      ** T
6b30: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70  his allows the p
6b40: 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74  ->pEList field t
6b50: 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f  o be omitted fro
6b60: 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 63  m the sorted rec
6b70: 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61  ord,.      ** sa
6b80: 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43  ving space and C
6b90: 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20  PU cycles.  */. 
6ba0: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c       ecelFlags |
6bb0: 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  = (SQLITE_ECEL_O
6bc0: 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43  MITREF|SQLITE_EC
6bd0: 45 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20 20 66  EL_REF);.      f
6be0: 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53  or(i=pSort->nOBS
6bf0: 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72  at; i<pSort->pOr
6c00: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
6c10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
6c20: 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  j;.        if( (
6c30: 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  j = pSort->pOrde
6c40: 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  rBy->a[i].u.x.iO
6c50: 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
6c60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
6c70: 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e  ist->a[j-1].u.x.
6c80: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b  iOrderByCol = i+
6c90: 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  1-pSort->nOBSat;
6ca0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6cb0: 20 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69 67   }.      regOrig
6cc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
6cd0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  rt( eDest==SRT_S
6ce0: 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  et || eDest==SRT
6cf0: 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  _Mem .          
6d00: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
6d10: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
6d20: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
6d30: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73 75  .    }.    nResu
6d40: 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 45  ltCol = sqlite3E
6d50: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
6d60: 70 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73 74  pParse,p->pEList
6d70: 2c 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20  ,regResult,.    
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6da0: 20 20 20 20 20 30 2c 65 63 65 6c 46 6c 61 67 73       0,ecelFlags
6db0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
6dc0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
6dd0: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
6de0: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
6df0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
6e00: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
6e10: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
6e20: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
6e30: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
6e40: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
6e50: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
6e60: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
6e70: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
6e80: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
6e90: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
6ea0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
6eb0: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
6ec0: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
6ed0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
6ee0: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
6ef0: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
6f00: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
6f10: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
6f20: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
6f30: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
6f40: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
6f60: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
6f70: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
6f80: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
6f90: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
6fa0: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
6fb0: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
6fc0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6fd0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
6fe0: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
6ff0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
7000: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
7010: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
7020: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
7030: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
7040: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
7050: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
7060: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
7070: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7080: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
7090: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
70a0: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
70b0: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
70c0: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
70d0: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
70e0: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
70f0: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
7100: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
7110: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
7120: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7130: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7140: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
7150: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
7160: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
7170: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
7180: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7190: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
71a0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
71b0: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
71c0: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
71d0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
71e0: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
71f0: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
7200: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
7210: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
7220: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
7230: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
7240: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7250: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
7260: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
7270: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
7280: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
7290: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
72a0: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
72b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
72c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
72d0: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
72e0: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
72f0: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
7300: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
7310: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
7320: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7340: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
7350: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
7360: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
7370: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
7380: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
7390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
73a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
73b0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
73c0: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
73d0: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
73e0: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
73f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7400: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
7410: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
7420: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
7430: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
7440: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
7450: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
7460: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7470: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7480: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7490: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
74a0: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
74b0: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
74c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
74d0: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
74e0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
74f0: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
7500: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7510: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
7520: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
7530: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7540: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
7550: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
7560: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
7570: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
7580: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
7590: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
75a0: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
75b0: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
75c0: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
75d0: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
75e0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
75f0: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
7600: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
7610: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7620: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
7630: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
7640: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
7650: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
7660: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
7670: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
7680: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
7690: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
76a0: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
76b0: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
76c0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
76d0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
76e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
76f0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7700: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
7710: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
7720: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
7730: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7740: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
7750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7760: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7770: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7780: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7790: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
77a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
77b0: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
77c0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65  t, iParm, r1, re
77d0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
77e0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Col);.      sqli
77f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7800: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7810: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7820: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
7830: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
7840: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
7850: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
7860: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
7870: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
7880: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
7890: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
78a0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
78b0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
78c0: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
78d0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
78e0: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
78f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7900: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
7910: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
7920: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7940: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7950: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7960: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
7970: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
7980: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
7990: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
79a0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
79b0: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
79c0: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
79d0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
79e0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
79f0: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7a00: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7a10: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
7a20: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
7a30: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
7a40: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7a50: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
7a60: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7a70: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
7a80: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7a90: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ( eDest==SRT_Fif
7aa0: 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  o );.      testc
7ab0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7ac0: 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20  DistFifo );.    
7ad0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7ae0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
7af0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7b00: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
7b10: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
7b20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7b30: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
7b40: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
7b50: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
7b60: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
7b70: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
7b80: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
7b90: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
7ba0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
7bb0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
7bc0: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
7bd0: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
7be0: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
7bf0: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
7c00: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
7c10: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
7c20: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
7c30: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
7c40: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
7c50: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
7c60: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
7c70: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
7c80: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
7c90: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
7ca0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
7cb0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
7cc0: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
7cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7ce0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7cf0: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
7d00: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
7d10: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
7d20: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
7d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
7d40: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
7d50: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
7d60: 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75  ,regResult,nResu
7d70: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
7d80: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
7d90: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
7da0: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
7db0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7dc0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7dd0: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7de0: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67  1+nPrefixReg,reg
7df0: 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78  Result,1,nPrefix
7e00: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
7e10: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
7e20: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
7e30: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
7e40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7e50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
7e60: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
7e70: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
7e80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7e90: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
7ea0: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
7eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7ec0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7ed0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
7ee0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
7ef0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
7f00: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
7f10: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
7f20: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
7f30: 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78  rse, r1, nPrefix
7f40: 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72  Reg+1);.      br
7f50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
7f60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7f70: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
7f80: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
7f90: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
7fa0: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
7fb0: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
7fc0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
7fd0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
7fe0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
7ff0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
8000: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
8010: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
8020: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
8030: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
8040: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
8050: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
8060: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
8070: 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79  t first glance y
8080: 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77  ou would think w
8090: 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65  e could optimize
80a0: 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20   out the.       
80b0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20   ** ORDER BY in 
80c0: 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20  this case since 
80d0: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74  the order of ent
80e0: 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a  ries in the set.
80f0: 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20          ** does 
8100: 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74  not matter.  But
8110: 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
8120: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
8130: 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  in which.       
8140: 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64   ** case the ord
8150: 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a  er does matter *
8160: 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  /.        pushOn
8170: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
8180: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
8190: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
81a0: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
81b0: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
81c0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
81d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
81e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
81f0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
8200: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
8210: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
8220: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d  est->zAffSdst)==
8230: 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20  nResultCol );.  
8240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8250: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
8260: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
8270: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
8280: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31   .            r1
8290: 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
82a0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
82b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
82c0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
82d0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
82e0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
82f0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8310: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
8320: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
8330: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8340: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8350: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8360: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
8370: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8390: 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
83a0: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
83b0: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
83c0: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
83d0: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
83e0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
83f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
8400: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8410: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50  P_Integer, 1, iP
8420: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
8430: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
8440: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
8450: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
8460: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
8470: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8480: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
8490: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
84a0: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
84b0: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
84c0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
84d0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
84e0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
84f0: 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20  ell or array of 
8500: 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  .    ** memory c
8510: 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f  ells and break o
8520: 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ut of the scan l
8530: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
8540: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
8550: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8560: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8570: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70  t( nResultCol<=p
8580: 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20  Dest->nSdst );. 
8590: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
85a0: 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20 20  orter(.         
85b0: 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74     pParse, pSort
85c0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
85d0: 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74  regOrig, nResult
85e0: 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29  Col, nPrefixReg)
85f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8600: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
8610: 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74  ResultCol==pDest
8620: 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20  ->nSdst );.     
8630: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65     assert( regRe
8640: 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20  sult==iParm );. 
8650: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
8660: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
8670: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
8680: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
8690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
86a0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
86b0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
86c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
86d0: 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52   */..    case SR
86e0: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20  T_Coroutine:    
86f0: 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20     /* Send data 
8700: 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  to a co-routine 
8710: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
8720: 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20  Output: {       
8730: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72   /* Return the r
8740: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
8750: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8760: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
8770: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8780: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
8790: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
87a0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
87b0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
87c0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
87d0: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
87e0: 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f  gOrig, nResultCo
87f0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
8800: 20 20 20 20 20 20 20 20 20 20 6e 50 72 65 66 69            nPrefi
8810: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
8820: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
8830: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
8840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8850: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
8860: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
8870: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
8880: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8890: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
88a0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
88b0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
88c0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
88d0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
88e0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
88f0: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8900: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8910: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8920: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
8930: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
8940: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
8950: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
8960: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
8970: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
8980: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
8990: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
89a0: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
89b0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
89c0: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
89d0: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
89e0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
89f0: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
8a00: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
8a10: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
8a20: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
8a30: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
8a40: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
8a50: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
8a60: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
8a70: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
8a80: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
8a90: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
8aa0: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
8ab0: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
8ac0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8ad0: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
8ae0: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
8af0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
8b00: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
8b10: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
8b20: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
8b30: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
8b40: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
8b50: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
8b60: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
8b70: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
8b80: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
8b90: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
8ba0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
8bb0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
8bc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8bd0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
8be0: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
8bf0: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
8c00: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
8c10: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
8c20: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8c30: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
8c40: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
8c50: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
8c60: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
8c70: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
8c80: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
8c90: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
8ca0: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
8cb0: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
8cc0: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
8cd0: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
8ce0: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
8cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
8d00: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
8d10: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
8d50: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
8d60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
8d70: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
8d80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8d90: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
8da0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
8db0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
8dc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
8dd0: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
8de0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
8df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8e00: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
8e10: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
8e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8e30: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
8e40: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
8e50: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
8e60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
8e70: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
8e80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8e90: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
8ec0: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
8ed0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
8ee0: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
8f00: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
8f10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8f20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
8f30: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
8f40: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
8f50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8f60: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
8f70: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
8f80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8f90: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
8fa0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8fb0: 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65  arm, r1, r2, nKe
8fc0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y+2);.      if( 
8fd0: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
8fe0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8ff0: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
9000: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
9010: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
9020: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
9030: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
9040: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
9050: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
9060: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9070: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9080: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
9090: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
90a0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
90b0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
90c0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
90d0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
90e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
90f0: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
9100: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
9110: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
9120: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
9130: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
9140: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
9150: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
9160: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
9170: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
9180: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
9190: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
91a0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
91b0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
91c0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
91d0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
91e0: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
91f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9200: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
9210: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
9220: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
9230: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
9240: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
9250: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
9260: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
9270: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
9280: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
9290: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
92a0: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
92b0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
92c0: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
92d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
92e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
92f0: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
9300: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
9310: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
9320: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
9330: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
9340: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
9350: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
9360: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
9370: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
9380: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
9390: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
93a0: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
93b0: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
93c0: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  ){.  int nExtra 
93d0: 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  = (N+X)*(sizeof(
93e0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73  CollSeq*)+1) - s
93f0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
9400: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
9410: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
9420: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
9430: 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72  KeyInfo) + nExtr
9440: 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
9450: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
9460: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
9470: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
9480: 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29  KeyField = (u16)
9490: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69  N;.    p->nAllFi
94a0: 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29  eld = (u16)(N+X)
94b0: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
94c0: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
94d0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
94e0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
94f0: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
9500: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
9510: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
9520: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
9530: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
9540: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
9550: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
9560: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
9570: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
9580: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
9590: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
95a0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
95b0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
95c0: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
95d0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70  qlite3DbFreeNN(p
95e0: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
95f0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
9600: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
9610: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
9620: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9630: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
9640: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
9650: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9660: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
9670: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
9680: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
9690: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
96a0: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
96b0: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
96c0: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
96d0: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
96e0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
96f0: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
9700: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
9710: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
9720: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
9730: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
9740: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
9750: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
9760: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9770: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
9780: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
9790: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
97a0: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
97b0: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
97c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
97d0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
97e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
97f0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
9800: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
9810: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
9820: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
9830: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
9840: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
9850: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
9860: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
9870: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
9880: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
9890: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
98a0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
98b0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
98c0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
98d0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
98e0: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
98f0: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
9900: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
9910: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
9920: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
9930: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
9940: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
9950: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
9960: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9970: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
9980: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
9990: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
99a0: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
99b0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
99c0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
99d0: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
99e0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
99f0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
9a00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
9a10: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
9a20: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
9a30: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
9a40: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
9a50: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
9a60: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
9a70: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
9a80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
9a90: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9aa0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9ab0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
9ac0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
9ad0: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
9ae0: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
9af0: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
9b00: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
9b10: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
9b20: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
9b30: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
9b40: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
9b50: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
9b60: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
9b70: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
9b80: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
9b90: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9ba0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
9bb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9bc0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
9bd0: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
9be0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
9bf0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
9c00: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
9c10: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
9c20: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
9c30: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
9c40: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
9c50: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
9c60: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
9c70: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
9c80: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
9c90: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
9ca0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  tem++){.      pI
9cb0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
9cc0: 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  art] = sqlite3Ex
9cd0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
9ce0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
9cf0: 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  );.      pInfo->
9d00: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
9d10: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
9d20: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
9d30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
9d40: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  o;.}../*.** Name
9d50: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
9d60: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
9d70: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
9d80: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
9d90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
9da0: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
9db0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
9dc0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
9dd0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
9de0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
9df0: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
9e00: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
9e10: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
9e20: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
9e30: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
9e40: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
9e50: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
9e60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
9e70: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
9e80: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
9e90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
9ea0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
9eb0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
9ec0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
9ed0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
9ee0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
9ef0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
9f00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
9f10: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
9f20: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
9f30: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
9f40: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
9f50: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
9f60: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
9f70: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
9f80: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
9f90: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
9fa0: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
9fb0: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
9fc0: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
9fd0: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
9fe0: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
9ff0: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
a000: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
a010: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a020: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
a030: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
a040: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
a050: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69  ar *zUsage){.  i
a060: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
a070: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
a080: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a090: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
a0a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
a0b0: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
a0c0: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
a0d0: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
a0e0: 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
a0f0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a100: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
a110: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
a120: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
a130: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
a140: 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73  ** Assign expres
a150: 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65  sion b to lvalue
a160: 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f   a. A second, no
a170: 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20  -op, version of 
a180: 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73  this macro.** is
a190: 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53   provided when S
a1a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a1b0: 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  IN is defined. T
a1c0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
a1d0: 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65  ode.** in sqlite
a1e0: 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73  3Select() to ass
a1f0: 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74  ign values to st
a200: 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76  ructure member v
a210: 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a  ariables that.**
a220: 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53   only exist if S
a230: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a240: 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  IN is not define
a250: 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74  d without pollut
a260: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  ing the.** code 
a270: 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72  with #ifndef dir
a280: 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65  ectives..*/.# de
a290: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
a2a0: 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d  nteger(a, b) a =
a2b0: 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d   b..#else./* No-
a2c0: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
a2d0: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
a2e0: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
a2f0: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
a300: 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  e explainTempTab
a310: 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  le(y,z).# define
a320: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
a330: 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  er(y,z).#endif..
a340: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a350: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a360: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
a370: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
a380: 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a  ND_SELECT)./*.**
a390: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
a3a0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
a3b0: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
a3c0: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
a3d0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
a3e0: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
a3f0: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
a400: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
a410: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
a420: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
a430: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
a440: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
a450: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  forms:.**.**   "
a460: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
a470: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
a480: 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20  Sub2 (op)".**   
a490: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
a4a0: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
a4b0: 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50  iSub2 USING TEMP
a4c0: 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a   B-TREE (op)".**
a4d0: 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20  .** where iSub1 
a4e0: 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68  and iSub2 are th
a4f0: 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65  e integers passe
a500: 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  d as the corresp
a510: 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  onding.** functi
a520: 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61  on parameters, a
a530: 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78  nd op is the tex
a540: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
a550: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
a560: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  r.** of the same
a570: 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d   name. The param
a580: 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62  eter "op" must b
a590: 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  e one of TK_UNIO
a5a0: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a  N, TK_EXCEPT,.**
a5b0: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72   TK_INTERSECT or
a5c0: 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72   TK_ALL. The fir
a5d0: 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20  st form is used 
a5e0: 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65  if argument bUse
a5f0: 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65  Tmp is .** false
a600: 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20  , or the second 
a610: 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72  form if it is tr
a620: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
a630: 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  id explainCompos
a640: 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ite(.  Parse *pP
a650: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
a660: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
a670: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
a680: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6a0: 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  One of TK_UNION,
a6b0: 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20   TK_EXCEPT etc. 
a6c0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20  */.  int iSub1, 
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
a6f0: 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69   id 1 */.  int i
a700: 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20  Sub2,           
a710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
a720: 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20  bquery id 2 */. 
a730: 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20   int bUseTmp    
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65   /* True if a te
a760: 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65  mp table was use
a770: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
a780: 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c  ( op==TK_UNION |
a790: 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  | op==TK_EXCEPT 
a7a0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
a7b0: 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c  ECT || op==TK_AL
a7c0: 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  L );.  if( pPars
a7d0: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
a7e0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
a7f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a800: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
a810: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
a820: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
a830: 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42  b, "COMPOUND SUB
a840: 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25  QUERIES %d AND %
a850: 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31  d %s(%s)", iSub1
a860: 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20  , iSub2,.       
a870: 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20   bUseTmp?"USING 
a880: 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22  TEMP B-TREE ":""
a890: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f  , selectOpName(o
a8a0: 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  p).    );.    sq
a8b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
a8c0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
a8d0: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
a8e0: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
a8f0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
a900: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
a910: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
a920: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
a930: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
a940: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
a950: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
a960: 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
a970: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
a980: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
a990: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
a9a0: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
a9b0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
a9c0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
a9d0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
a9e0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
a9f0: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
aa00: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
aa10: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
aa20: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
aa30: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
aa40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
aa50: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
aa60: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
aa70: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
aa80: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
aa90: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
aaa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
aab0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
aac0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
aad0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
aae0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
aaf0: 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ent */.  SortCtx
ab00: 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e   *pSort,   /* In
ab10: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
ab20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ab30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
ab40: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
ab50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
ab60: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
ab70: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
ab80: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
ab90: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
aba0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
abb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
abe0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
abf0: 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d   int addrBreak =
ac00: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
ac10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
ac20: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78   Jump here to ex
ac30: 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  it loop */.  int
ac40: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
ac50: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ac60: 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d  abel(v);  /* Jum
ac70: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
ac80: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
ac90: 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f  ddr;.  int addrO
aca0: 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  nce = 0;.  int i
acb0: 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Tab;.  ExprList 
acc0: 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72  *pOrderBy = pSor
acd0: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  t->pOrderBy;.  i
ace0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
acf0: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69  ->eDest;.  int i
ad00: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
ad10: 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67  DParm;.  int reg
ad20: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
ad30: 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  wid;.  int iCol;
ad40: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
ad50: 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20  nt iSortTab;    
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ad70: 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
ad80: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
ad90: 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b    int nSortData;
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61    /* Trailing va
adc0: 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f  lues to read fro
add0: 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  m sorter */.  in
ade0: 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b  t i;.  int bSeq;
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
ae10: 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  f sorter record 
ae20: 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f  includes seq. no
ae30: 2e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  . */.  struct Ex
ae40: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75  prList_item *aOu
ae50: 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  tEx = p->pEList-
ae60: 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  >a;..  assert( a
ae70: 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20  ddrBreak<0 );.  
ae80: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
ae90: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
aea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aeb0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
aec0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
aed0: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
aee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
aef0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65  eGoto(v, addrBre
af00: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
af10: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
af20: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
af30: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54  BkOut);.  }.  iT
af40: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  ab = pSort->iECu
af50: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
af60: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
af70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
af80: 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d  utine || eDest==
af90: 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72  SRT_Mem ){.    r
afa0: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
afb0: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
afc0: 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72  >iSdst;.    nSor
afd0: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
afe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
aff0: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
b000: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
b010: 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  e);.    regRow =
b020: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
b030: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
b040: 6c 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74  lumn);.    nSort
b050: 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  Data = nColumn;.
b060: 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72    }.  nKey = pOr
b070: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70  derBy->nExpr - p
b080: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
b090: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
b0a0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
b0b0: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
b0c0: 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20   int regSortOut 
b0d0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
b0e0: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
b0f0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b100: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
b110: 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20  labelBkOut ){.  
b120: 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
b130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
b140: 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
b150: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b160: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b180: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
b190: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
b1a0: 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44  t, nKey+1+nSortD
b1b0: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64  ata);.    if( ad
b1c0: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
b1d0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b1e0: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
b1f0: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
b200: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b210: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
b220: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
b230: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b240: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
b250: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
b260: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
b270: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b280: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
b290: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
b2a0: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
b2b0: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
b2c0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
b2d0: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
b2e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b2f0: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
b300: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
b310: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b320: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b330: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b340: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69  Continue);.    i
b350: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
b360: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
b370: 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f  }.  for(i=0, iCo
b380: 6c 3d 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c 6e  l=nKey+bSeq; i<n
b390: 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a  SortData; i++){.
b3a0: 20 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20      int iRead;. 
b3b0: 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d     if( aOutEx[i]
b3c0: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
b3d0: 20 29 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20   ){.      iRead 
b3e0: 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e  = aOutEx[i].u.x.
b3f0: 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20  iOrderByCol-1;. 
b400: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b410: 69 52 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b 0a  iRead = iCol++;.
b420: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b430: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b440: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54  P_Column, iSortT
b450: 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f  ab, iRead, regRo
b460: 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  w+i);.    VdbeCo
b470: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
b480: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
b490: 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  ? aOutEx[i].zNam
b4a0: 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53  e : aOutEx[i].zS
b4b0: 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69  pan));.  }.  swi
b4c0: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
b4d0: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
b4e0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
b4f0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
b500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b510: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
b520: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
b530: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
b540: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b550: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
b560: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
b570: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
b580: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
b590: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
b5a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b5b0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
b5c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b5d0: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
b5e0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
b5f0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c  rt( nColumn==sql
b600: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65  ite3Strlen30(pDe
b610: 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b  st->zAffSdst) );
b620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b630: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
b640: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
b650: 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52  w, nColumn, regR
b660: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
b680: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e  est->zAffSdst, n
b690: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
b6a0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
b6b0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
b6c0: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
b6d0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71  olumn);.      sq
b6e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b6f0: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
b700: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
b710: 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  wid, regRow, nCo
b720: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  lumn);.      bre
b730: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b740: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
b750: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
b760: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
b770: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
b780: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
b790: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
b7a0: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
b7b0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
b7c0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
b7d0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
b7e0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20  _Coroutine ); . 
b7f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
b800: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b810: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b820: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
b830: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
b840: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b850: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
b860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b870: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
b880: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64  tRow, pDest->iSd
b890: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
b8a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b8b0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
b8c0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
b8d0: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
b8e0: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
b8f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b900: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b910: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
b920: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
b930: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
b940: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
b950: 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69  egRowid ){.    i
b960: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  f( eDest==SRT_Se
b970: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
b980: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
b990: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ge(pParse, regRo
b9a0: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
b9b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
b9c0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
b9d0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
b9e0: 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ow);.    }.    s
b9f0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ba00: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
ba10: 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Rowid);.  }.  /*
ba20: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
ba30: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
ba40: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ba50: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
ba60: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
ba70: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
ba80: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
ba90: 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rter ){.    sqli
baa0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bab0: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
bac0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
bad0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
bae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
baf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bb00: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
bb10: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
bb20: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
bb30: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
bb40: 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  n ) sqlite3VdbeA
bb50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
bb60: 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  rn, pSort->regRe
bb70: 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  turn);.  sqlite3
bb80: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
bb90: 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
bba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
bbb0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
bbc0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
bbd0: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
bbe0: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
bbf0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
bc00: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
bc10: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
bc20: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
bc30: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  aller..**.** Als
bc40: 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
bc50: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
bc60: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
bc70: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
bc80: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70  .** result in *p
bc90: 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20  EstWidth..**.** 
bca0: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
bcb0: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
bcc0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
bcd0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
bce0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
bcf0: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
bd00: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
bd10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
bd20: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
bd30: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
bd40: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
bd50: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
bd60: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
bd70: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
bd80: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
bd90: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
bda0: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
bdb0: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
bdc0: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
bdd0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
bde0: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
bdf0: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
be00: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
be10: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
be20: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
be30: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
be40: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
be50: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
be60: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
be70: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
be80: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
be90: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
bea0: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
beb0: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
bec0: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
bed0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
bee0: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
bef0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
bf00: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
bf10: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
bf20: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
bf30: 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61  either 3 or 6 pa
bf40: 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69  rameters dependi
bf50: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
bf60: 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49   not.** the SQLI
bf70: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
bf80: 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c  _METADATA compil
bf90: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
bfa0: 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66   used..*/.#ifdef
bfb0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
bfc0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23  OLUMN_METADATA.#
bfd0: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
bfe0: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f  pe(A,B,C,D,E) co
bff0: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
c000: 2c 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f 2a  ,C,D,E).#else /*
c010: 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c   if !defined(SQL
c020: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
c030: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23  N_METADATA) */.#
c040: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
c050: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f  pe(A,B,C,D,E) co
c060: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
c070: 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
c080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
c090: 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61  mnTypeImpl(.  Na
c0a0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
c0b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c0c0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c0d0: 54 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a 70  TADATA.  Expr *p
c0e0: 45 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78 70  Expr.#else.  Exp
c0f0: 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73  r *pExpr,.  cons
c100: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44  t char **pzOrigD
c110: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
c120: 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63  **pzOrigTab,.  c
c130: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
c140: 69 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b 0a  igCol.#endif.){.
c150: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
c160: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  ype = 0;.  int j
c170: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c180: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c190: 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f  TADATA.  char co
c1a0: 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  nst *zOrigDb = 0
c1b0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
c1c0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
c1d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
c1e0: 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  gCol = 0;.#endif
c1f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
c200: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
c210: 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
c220: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c230: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
c240: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20  G_COLUMN );  /* 
c250: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
c260: 65 73 20 62 65 66 6f 72 65 20 61 67 67 72 65 67  es before aggreg
c270: 61 74 65 73 0a 20 20 20 20 20 20 20 20 20 20 20  ates.           
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
c2a0: 72 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  re processed */.
c2b0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
c2c0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
c2d0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
c2e0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
c2f0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
c300: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
c310: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
c320: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
c330: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
c340: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
c350: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
c360: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
c370: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
c380: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
c390: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
c3a0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c3b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c3c0: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
c3d0: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
c3e0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
c3f0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
c400: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c410: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
c420: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
c430: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
c440: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
c450: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
c460: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
c470: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
c480: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
c490: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  !pTab ){.       
c4a0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
c4b0: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
c4c0: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
c4d0: 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j=0;j<pTabList->
c4e0: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
c4f0: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
c500: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b  pExpr->iTable;j+
c510: 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +);.        if( 
c520: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
c530: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
c540: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
c550: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
c560: 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73      pS = pTabLis
c570: 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b  t->a[j].pSelect;
c580: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c590: 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20            pNC = 
c5a0: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
c5b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
c5c0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
c5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
c5e0: 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65  t one time, code
c5f0: 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54   such as "SELECT
c600: 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61   new.x" within a
c610: 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20   trigger would. 
c620: 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
c630: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74  this condition t
c640: 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68  o run.  Since th
c650: 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74  en, we have rest
c660: 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20  ructured how.   
c670: 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
c680: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
c690: 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f  d and so this co
c6a0: 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f  ndition is no lo
c6b0: 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  nger .        **
c6c0: 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76   possible. Howev
c6d0: 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c  er, it can still
c6e0: 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61   be true for sta
c6f0: 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20  tements like.   
c700: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
c710: 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a  owing:.        *
c720: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43  *.        **   C
c730: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63  REATE TABLE t1(c
c740: 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20  ol INTEGER);.   
c750: 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
c760: 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29   (SELECT t1.col)
c770: 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20   FROM FROM t1;. 
c780: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
c790: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e    ** when column
c7a0: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
c7b0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
c7c0: 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74  on "t1.col" in t
c7d0: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  he .        ** s
c7e0: 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68  ub-select. In th
c7f0: 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65  is case, set the
c800: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20   column type to 
c810: 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20  NULL, even.     
c820: 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20     ** though it 
c830: 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65  should really be
c840: 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20   "INTEGER"..    
c850: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
c860: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
c870: 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20  problem, as the 
c880: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22  column type of "
c890: 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72  t1.col" is never
c8a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64  .        ** used
c8b0: 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  . When columnTyp
c8c0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
c8d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c8e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45  .        ** "(SE
c8f0: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74  LECT t1.col)", t
c900: 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20  he correct type 
c910: 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65  is returned (see
c920: 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20   the TK_SELECT. 
c930: 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68         ** branch
c940: 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
c950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c960: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
c970: 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d  ( pTab && pExpr-
c980: 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20  >pTab==pTab );. 
c990: 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20       if( pS ){. 
c9a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74         /* The "t
c9b0: 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c  able" is actuall
c9c0: 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  y a sub-select o
c9d0: 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20  r a view in the 
c9e0: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20  FROM clause.    
c9f0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45      ** of the SE
ca00: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
ca10: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
ca20: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20  ration type and 
ca30: 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a  origin.        *
ca40: 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  * data for the r
ca50: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
ca60: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
ca70: 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ct..        */. 
ca80: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
ca90: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70  =0 && iCol<pS->p
caa0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
cab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
cac0: 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61  iCol is less tha
cad0: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
cae0: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75   expression requ
caf0: 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  ests the.       
cb00: 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74     ** rowid of t
cb10: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72  he sub-select or
cb20: 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72   view. This expr
cb30: 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20  ession is legal 
cb40: 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20  (see .          
cb50: 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73  ** test case mis
cb60: 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77  c2.2.2) - it alw
cb70: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
cb80: 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20   NULL..         
cb90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61   */.          Na
cba0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
cbb0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
cbc0: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
cbd0: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20  [iCol].pExpr;.  
cbe0: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63          sNC.pSrc
cbf0: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
cc00: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
cc10: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
cc20: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
cc30: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
cc40: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
cc50: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
cc60: 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a  C, p,&zOrigDb,&z
cc70: 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f  OrigTab,&zOrigCo
cc80: 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  l); .        }. 
cc90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cca0: 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61      /* A real ta
ccb0: 62 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61 62  ble or a CTE tab
ccc0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  le */.        as
ccd0: 73 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69 66  sert( !pS );.#if
cce0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ccf0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
cd00: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
cd10: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
cd20: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
cd30: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
cd40: 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43  =XN_ROWID || (iC
cd50: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
cd60: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
cd70: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
cd80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
cd90: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
cda0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43            zOrigC
cdb0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
cdc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cdd0: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
cde0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
cdf0: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
ce00: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
ce10: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70  te3ColumnType(&p
ce20: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c  Tab->aCol[iCol],
ce30: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
ce40: 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d        zOrigTab =
ce50: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
ce60: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70        if( pNC->p
ce70: 50 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e 70  Parse && pTab->p
ce80: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
ce90: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
cea0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
ceb0: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
cec0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
ced0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
cee0: 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  rigDb = pNC->pPa
cef0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
cf00: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
cf10: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
cf20: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
cf30: 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69  ==XN_ROWID || (i
cf40: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
cf50: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
cf60: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
cf70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
cf80: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
cf90: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
cfa0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
cfb0: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
cfc0: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
cfd0: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
cfe0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
cff0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d000: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
d010: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
d020: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
d030: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
d040: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
d050: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
d060: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
d070: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
d080: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69  d.      ** origi
d090: 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73  n info for the s
d0a0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
d0b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
d0c0: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  f the SELECT.   
d0d0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e     ** statement.
d0e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d0f0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
d100: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
d110: 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  S = pExpr->x.pSe
d120: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
d130: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
d140: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
d150: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
d160: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
d170: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
d180: 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53   );.      sNC.pS
d190: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
d1a0: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
d1b0: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
d1c0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
d1d0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
d1e0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
d1f0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
d200: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
d210: 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20   &zOrigCol); .  
d220: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d230: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
d240: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d250: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
d260: 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  A  .  if( pzOrig
d270: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
d280: 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70  ( pzOrigTab && p
d290: 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20  zOrigCol );.    
d2a0: 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69  *pzOrigDb = zOri
d2b0: 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  gDb;.    *pzOrig
d2c0: 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a  Tab = zOrigTab;.
d2d0: 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d      *pzOrigCol =
d2e0: 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23   zOrigCol;.  }.#
d2f0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a  endif.  return z
d300: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
d310: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
d320: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
d330: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
d340: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
d350: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
d360: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
d370: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
d380: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
d390: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d3a0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
d3b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
d3c0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
d3d0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
d3e0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
d3f0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
d400: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
d410: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
d420: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
d430: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
d440: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
d450: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
d460: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
d470: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
d480: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
d490: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
d4a0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
d4b0: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
d4c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
d4d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d4e0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
d4f0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
d500: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
d510: 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65  ar *zType;.#ifde
d520: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d530: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
d540: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d550: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
d560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
d570: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
d580: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
d590: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79  Col = 0;.    zTy
d5a0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d5b0: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
d5c0: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
d5d0: 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f  OrigCol);..    /
d5e0: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
d5f0: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
d600: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
d610: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
d620: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
d630: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
d640: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
d650: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
d660: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
d670: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
d680: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
d690: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
d6a0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d6b0: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
d6c0: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c  SE, zOrigDb, SQL
d6d0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d6f0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d700: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
d710: 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f  OrigTab, SQLITE_
d720: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d730: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d740: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d750: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
d760: 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  gCol, SQLITE_TRA
d770: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
d780: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d790: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
d7a0: 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
d7b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d7c0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d7d0: 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45  COLNAME_DECLTYPE
d7e0: 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f  , zType, SQLITE_
d7f0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
d800: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
d810: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
d820: 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a  ECLTYPE) */.}...
d830: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
d840: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
d850: 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  or a SELECT stat
d860: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
d870: 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20   only guarantee 
d880: 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65  that SQLite make
d890: 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
d8a0: 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20  ames is that if 
d8b0: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61  the.** column ha
d8c0: 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61  s an AS clause a
d8d0: 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61  ssigning it a na
d8e0: 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  me, that will be
d8f0: 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a   the name used..
d900: 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f  ** That is the o
d910: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67  nly documented g
d920: 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76  uarantee.  Howev
d930: 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70  er, countless ap
d940: 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65  plications.** de
d950: 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65  veloped over the
d960: 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65   years have made
d970: 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70   baseless assump
d980: 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75  tions about colu
d990: 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20  mn names.** and 
d9a0: 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68  will break if th
d9b0: 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ose assumptions 
d9c0: 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c  changes.  Hence,
d9d0: 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75   use extreme cau
d9e0: 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64  tion.** when mod
d9f0: 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74  ifying this rout
da00: 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65  ine to avoid bre
da10: 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a  aking legacy..**
da20: 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71  .** See Also: sq
da30: 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
da40: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a  ExprList().**.**
da50: 20 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72   The PRAGMA shor
da60: 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61  t_column_names a
da70: 6e 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63  nd PRAGMA full_c
da80: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74  olumn_names sett
da90: 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72  ings are.** depr
daa0: 65 63 61 74 65 64 2e 20 20 54 68 65 20 64 65 66  ecated.  The def
dab0: 61 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20  ault setting is 
dac0: 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f  short=ON, full=O
dad0: 46 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c  FF.  99.9% of al
dae0: 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  l.** application
daf0: 73 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65  s should operate
db00: 20 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65   this way.  Neve
db10: 72 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65  rtheless, we nee
db20: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65  d to support the
db30: 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20  .** other modes 
db40: 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a  for legacy:.**.*
db50: 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20  *    short=OFF, 
db60: 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43  full=OFF:      C
db70: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68  olumn name is th
db80: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 65 78  e text of the ex
db90: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a  pression has it.
dba0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbc0: 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61  originally appea
dbd0: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
dbe0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a   statement.  In.
dbf0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
dc20: 20 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65   zSpan of the re
dc30: 73 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e  sult expression.
dc40: 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d  .**.**    short=
dc50: 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20  ON, full=OFF:   
dc60: 20 20 20 20 28 54 68 69 73 20 69 73 20 74 68 65      (This is the
dc70: 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
dc80: 29 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  ).  If the resul
dc90: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c    refers directl
dcc0: 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c  y to a table col
dcd0: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  umn, then the.**
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
dd00: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
dd10: 20 69 73 20 6a 75 73 74 20 74 68 65 20 74 61 62   is just the tab
dd20: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20  le column.**    
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a 20            name: 
dd50: 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69  COLUMN.  Otherwi
dd60: 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a  se use zSpan..**
dd70: 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20  .**    full=ON, 
dd80: 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20  short=ANY:      
dd90: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
dda0: 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
ddb0: 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
ddc0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c    then the resul
ddf0: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69  t column name wi
de00: 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
de10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41    prefix, ex: TA
de40: 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68  BLE.COLUMN.  Oth
de50: 65 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e  erwise use zSpan
de60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
de70: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
de80: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
de90: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
dea0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
deb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
dec0: 63 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ct     /* Genera
ded0: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  te column names 
dee0: 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
def0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
df00: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
df10: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
df20: 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   i;.  Table *pTa
df30: 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  b;.  SrcList *pT
df40: 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
df50: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71  st *pEList;.  sq
df60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
df70: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
df80: 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41  llName;    /* TA
df90: 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f  BLE.COLUMN if no
dfa0: 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69   AS clause and i
dfb0: 73 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  s a direct table
dfc0: 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72   ref */.  int sr
dfd0: 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f  cName;     /* CO
dfe0: 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f  LUMN or TABLE.CO
dff0: 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c  LUMN if no AS cl
e000: 61 75 73 65 20 61 6e 64 20 69 73 20 64 69 72 65  ause and is dire
e010: 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ct */..#ifndef S
e020: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
e030: 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
e040: 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
e050: 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
e060: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
e070: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
e080: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
e090: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
e0a0: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64  colNamesSet || d
e0b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e0c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43  ) return;.  /* C
e0d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
e0e0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
e0f0: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
e100: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
e110: 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65  elect */.  while
e120: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
e130: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
e140: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
e150: 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
e160: 50 61 72 73 65 2c 70 53 65 6c 65 63 74 2c 28 22  Parse,pSelect,("
e170: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c 75 6d  generating colum
e180: 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a 20 20  n names\n"));.  
e190: 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65  pTabList = pSele
e1a0: 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69  ct->pSrc;.  pELi
e1b0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
e1c0: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
e1d0: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
e1e0: 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b  ( pTabList!=0 );
e1f0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
e200: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
e210: 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c  llName = (db->fl
e220: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
e230: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
e240: 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e   srcName = (db->
e250: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
e260: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
e270: 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20   || fullName;.  
e280: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
e290: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
e2a0: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
e2b0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
e2c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
e2d0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
e2e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20  >a[i].pExpr;..  
e2f0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
e300: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
e310: 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
e320: 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72  MN );  /* Agg pr
e330: 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74  ocessing has not
e340: 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20   run yet */.    
e350: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
e360: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70  K_COLUMN || p->p
e370: 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76  Tab!=0 ); /* Cov
e380: 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20 79 65  ering idx not ye
e390: 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 69  t coded */.    i
e3a0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
e3b0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  zName ){.      /
e3c0: 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65 20 61  * An AS clause a
e3d0: 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69 72 73  lways takes firs
e3e0: 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20 20  t priority */.  
e3f0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
e400: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
e410: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
e420: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
e430: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
e440: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
e450: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
e460: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 72      }else if( sr
e470: 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d 3d  cName && p->op==
e480: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
e490: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
e4a0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
e4b0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
e4c0: 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62    pTab = p->pTab
e4d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e4e0: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
e4f0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
e500: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
e510: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e520: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
e530: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
e540: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
e550: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
e560: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
e570: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
e580: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
e590: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
e5a0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
e5b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 75    }.      if( fu
e5c0: 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  llName ){.      
e5d0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
e5e0: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  0;.        zName
e5f0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
e600: 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  f(db, "%s.%s", p
e610: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
e620: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e630: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
e640: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
e650: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
e660: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
e670: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e690: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
e6a0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c  LNAME_NAME, zCol
e6b0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
e6c0: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NT);.      }.   
e6d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
e6e0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
e6f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
e700: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30  ;.      z = z==0
e710: 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   ? sqlite3MPrint
e720: 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  f(db, "column%d"
e730: 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33  , i+1) : sqlite3
e740: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b  DbStrDup(db, z);
e750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e760: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
e770: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
e780: 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   z, SQLITE_DYNAM
e790: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  IC);.    }.  }. 
e7a0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
e7b0: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
e7c0: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
e7d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
e7e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
e7f0: 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c  t (which is real
e800: 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ly the list of e
e810: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
e820: 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75  at form the resu
e830: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
e840: 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f  CT statement) co
e850: 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74  mpute appropriat
e860: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  e.** column name
e870: 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68  s for a table th
e880: 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  at would hold th
e890: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e8a0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c  t..**.** All col
e8b0: 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62  umn names will b
e8c0: 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20  e unique..**.** 
e8d0: 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Only the column 
e8e0: 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74  names are comput
e8f0: 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70  ed.  Column.zTyp
e900: 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c  e, Column.zColl,
e910: 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69  .** and other fi
e920: 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61  elds of Column a
e930: 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
e940: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
e950: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
e960: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
e970: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
e980: 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c  rs,.** store NUL
e990: 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20  L in *paCol and 
e9a0: 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20  0 in *pnCol and 
e9b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e9c0: 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  MEM..**.** The o
e9d0: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68  nly guarantee th
e9e0: 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20  at SQLite makes 
e9f0: 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  about column nam
ea00: 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68  es is that if th
ea10: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20  e.** column has 
ea20: 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73  an AS clause ass
ea30: 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65  igning it a name
ea40: 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74  , that will be t
ea50: 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a  he name used..**
ea60: 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c   That is the onl
ea70: 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61  y documented gua
ea80: 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72  rantee.  However
ea90: 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c  , countless appl
eaa0: 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65  ications.** deve
eab0: 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79  loped over the y
eac0: 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62  ears have made b
ead0: 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69  aseless assumpti
eae0: 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  ons about column
eaf0: 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69   names.** and wi
eb00: 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73  ll break if thos
eb10: 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68  e assumptions ch
eb20: 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75  anges.  Hence, u
eb30: 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69  se extreme cauti
eb40: 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66  on.** when modif
eb50: 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ying this routin
eb60: 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b  e to avoid break
eb70: 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a  ing legacy..**.*
eb80: 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65  * See Also: gene
eb90: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
eba0: 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
ebb0: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
ebc0: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
ebd0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
ebe0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ebf0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
ec00: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
ec10: 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d  * Expr list from
ec20: 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65   which to derive
ec30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
ec40: 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20  .  i16 *pnCol,  
ec50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
ec60: 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
ec70: 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a  f columns here *
ec80: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43  /.  Column **paC
ec90: 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ol          /* W
eca0: 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c  rite the new col
ecb0: 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f  umn list here */
ecc0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
ecd0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
ece0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
ecf0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
ed00: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
ed10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
ed20: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
ed30: 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20  u32 cnt;        
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ed50: 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61  ndex added to ma
ed60: 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71  ke the name uniq
ed70: 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  ue */.  Column *
ed80: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20  aCol, *pCol;    
ed90: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
eda0: 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63  ng over result c
edb0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
edc0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
edd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ede0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
edf0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
ee00: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
ee30: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20  /* Size of name 
ee60: 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20  in zName[] */.  
ee70: 48 61 73 68 20 68 74 3b 20 20 20 20 20 20 20 20  Hash ht;        
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ee90: 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c  ash table of col
eea0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20  umn names */..  
eeb0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
eec0: 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  &ht);.  if( pELi
eed0: 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  st ){.    nCol =
eee0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
eef0: 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74      aCol = sqlit
ef00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ef10: 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30  b, sizeof(aCol[0
ef20: 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65  ])*nCol);.    te
ef30: 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20  stcase( aCol==0 
ef40: 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e  );.    if( nCol>
ef50: 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33  32767 ) nCol = 3
ef60: 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2767;.  }else{. 
ef70: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
ef80: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
ef90: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28   assert( nCol==(
efa0: 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70  i16)nCol );.  *p
efb0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
efc0: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
efd0: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
efe0: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21  Col; i<nCol && !
eff0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f000: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
f010: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
f020: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
f030: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
f040: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e    */.    if( (zN
f050: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
f060: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
f070: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f080: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
f090: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
f0a0: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
f0b0: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
f0c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f0d0: 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72    Expr *pColExpr
f0e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
f0f0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
f100: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
f110: 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c       while( pCol
f120: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  Expr->op==TK_DOT
f130: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
f140: 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Expr = pColExpr-
f150: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
f160: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
f170: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  r!=0 );.      }.
f180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
f190: 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41  olExpr->op!=TK_A
f1a0: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
f1b0: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
f1c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
f1d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
f1e0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65   columns use the
f1f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d   column name nam
f200: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
f210: 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72   iCol = pColExpr
f220: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
f230: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
f240: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b   pColExpr->pTab;
f250: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f260: 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
f270: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
f280: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
f290: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  Key;.        zNa
f2a0: 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70  me = iCol>=0 ? p
f2b0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
f2c0: 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b  zName : "rowid";
f2d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f2e0: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
f2f0: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
f300: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
f310: 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70  Property(pColExp
f320: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
f330: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  );.        zName
f340: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a   = pColExpr->u.z
f350: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  Token;.      }el
f360: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  se{.        /* U
f370: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
f380: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
f390: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
f3a0: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
f3b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c       zName = pEL
f3c0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
f3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f3e0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a     if( zName ){.
f3f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
f400: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
f410: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
f420: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  lse{.      zName
f430: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
f440: 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c  f(db,"column%d",
f450: 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  i+1);.    }..   
f460: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
f470: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
f480: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
f490: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
f4a0: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
f4b0: 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f  nd an integer to
f4c0: 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61   the name so tha
f4d0: 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69  t it becomes uni
f4e0: 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  que..    */.    
f4f0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  cnt = 0;.    whi
f500: 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c  le( zName && sql
f510: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74  ite3HashFind(&ht
f520: 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  , zName)!=0 ){. 
f530: 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c       nName = sql
f540: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
f550: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
f560: 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Name>0 ){.      
f570: 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b    for(j=nName-1;
f580: 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49   j>0 && sqlite3I
f590: 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29  sdigit(zName[j])
f5a0: 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20  ; j--){}.       
f5b0: 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27   if( zName[j]=='
f5c0: 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a  :' ) nName = j;.
f5d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e        }.      zN
f5e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
f5f0: 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25  intf(db, "%.*z:%
f600: 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65  u", nName, zName
f610: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
f620: 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69  if( cnt>3 ) sqli
f630: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
f640: 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74  izeof(cnt), &cnt
f650: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  );.    }.    pCo
f660: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  l->zName = zName
f670: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ;.    sqlite3Col
f680: 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f  umnPropertiesFro
f690: 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a  mName(0, pCol);.
f6a0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26      if( zName &&
f6b0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
f6c0: 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70  rt(&ht, zName, p
f6d0: 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20  Col)==pCol ){.  
f6e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
f6f0: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  ult(db);.    }. 
f700: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
f710: 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66  Clear(&ht);.  if
f720: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f730: 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  ed ){.    for(j=
f740: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
f750: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f760: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
f770: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
f780: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f790: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
f7a0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
f7b0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
f7c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
f7d0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
f7e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f7f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65  ../*.** Add type
f800: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
f810: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20  nformation to a 
f820: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65  column list base
f830: 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54  d on.** a SELECT
f840: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a   statement..** .
f850: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
f860: 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61  st presumably ca
f870: 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f  me from selectCo
f880: 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70  lumnNamesFromExp
f890: 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20  rList()..** The 
f8a0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20  column list has 
f8b0: 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20  only names, not 
f8c0: 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69  types or collati
f8d0: 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ons.  This.** ro
f8e0: 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75  utine goes throu
f8f0: 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  gh and adds the 
f900: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
f910: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
f920: 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65   routine require
f930: 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74  s that all ident
f940: 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45  ifiers in the SE
f950: 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
f960: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  t be resolved..*
f970: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
f980: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
f990: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eAndCollation(. 
f9a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f9b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
f9c0: 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20  g contexts */.  
f9d0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
f9e0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c        /* Add col
f9f0: 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61  umn type informa
fa00: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62  tion to this tab
fa10: 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  le */.  Select *
fa20: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a  pSelect       /*
fa30: 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20   SELECT used to 
fa40: 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20  determine types 
fa50: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a  and collations *
fa60: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
fa70: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
fa80: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
fa90: 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  NC;.  Column *pC
faa0: 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ol;.  CollSeq *p
fab0: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Coll;.  int i;. 
fac0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75   Expr *p;.  stru
fad0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
fae0: 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *a;..  assert( 
faf0: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
fb00: 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74  assert( (pSelect
fb10: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
fb20: 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a  Resolved)!=0 );.
fb30: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
fb40: 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70  nCol==pSelect->p
fb50: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20  EList->nExpr || 
fb60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fb70: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
fb80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
fb90: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  urn;.  memset(&s
fba0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
fbb0: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  C));.  sNC.pSrcL
fbc0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
fbd0: 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65  Src;.  a = pSele
fbe0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  ct->pEList->a;. 
fbf0: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70   for(i=0, pCol=p
fc00: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61  Tab->aCol; i<pTa
fc10: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
fc20: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ol++){.    const
fc30: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
fc40: 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20    int n, m;.    
fc50: 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  p = a[i].pExpr;.
fc60: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
fc70: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
fc80: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a  0, 0, 0);.    /*
fc90: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e   pCol->szEst = .
fca0: 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a  .. // Column siz
fcb0: 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54  e est for SELECT
fcc0: 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73   tables never us
fcd0: 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e  ed */.    pCol->
fce0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
fcf0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
fd00: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65  );.    if( zType
fd10: 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71   ){.      m = sq
fd20: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
fd30: 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  ype);.      n = 
fd40: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
fd50: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
fd60: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
fd70: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
fd80: 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f  ocOrFree(db, pCo
fd90: 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29  l->zName, n+m+2)
fda0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  ;.      if( pCol
fdb0: 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
fdc0: 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d     memcpy(&pCol-
fdd0: 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79  >zName[n+1], zTy
fde0: 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20  pe, m+1);.      
fdf0: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
fe00: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54   |= COLFLAG_HAST
fe10: 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  YPE;.      }.   
fe20: 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d   }.    if( pCol-
fe30: 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70  >affinity==0 ) p
fe40: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
fe50: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
fe60: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
fe70: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
fe80: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
fe90: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
fea0: 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20  l->zColl==0 ){. 
feb0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c       pCol->zColl
fec0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
fed0: 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  up(db, pColl->zN
fee0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
fef0: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
ff00: 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e   = 1; /* Any non
ff10: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b  -zero value work
ff20: 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  s */.}../*.** Gi
ff30: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
ff40: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
ff50: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
ff60: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
ff70: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
ff80: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
ff90: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
ffa0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
ffb0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
ffc0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
ffd0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
ffe0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
fff0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10000 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
10010 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
10020 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
10030 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
10040 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
10050 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
10060 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
10070 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
10080 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
10090 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
100a0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
100b0 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
100c0 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
100d0 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
100e0 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
100f0 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
10100 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
10110 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
10120 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
10130 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
10140 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
10150 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
10160 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
10170 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
10180 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
10190 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
101a0 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
101b0 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
101c0 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
101d0 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
101e0 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61  Disable );.  pTa
101f0 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
10200 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
10210 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
10220 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
10230 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
10240 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
10250 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
10260 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
10270 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
10280 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
10290 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
102a0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ol);.  sqlite3Se
102b0 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
102c0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
102d0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
102e0 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
102f0 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
10300 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10310 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
10320 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
10330 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
10340 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
10350 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
10360 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
10370 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
10380 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
10390 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
103a0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
103b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
103c0 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
103d0 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
103e0 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
103f0 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
10400 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
10410 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
10420 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65  >pVdbe ){.    re
10430 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64  turn pParse->pVd
10440 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  be;.  }.  if( pP
10450 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
10460 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
10470 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
10480 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46  rse->db,SQLITE_F
10490 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20  actorOutConst). 
104a0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
104b0 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
104c0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
104d0 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
104e0 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f  e(pParse);.}.../
104f0 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
10500 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
10510 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
10520 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
10530 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
10540 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
10550 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20  imit->pLeft and 
10560 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 68  pLimit->pRight h
10570 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
10580 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
10590 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
105a0 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
105b0 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
105c0 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
105d0 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
105e0 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
105f0 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
10600 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
10610 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
10620 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
10630 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
10640 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
10650 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
10660 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
10670 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
10680 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
10690 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
106a0 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
106b0 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
106c0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
106d0 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
106e0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
106f0 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
10700 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
10710 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
10720 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
10730 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  mit->pLeft and p
10740 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20 20  Limit->pRight.  
10750 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69 4f  iLimit.** and iO
10760 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
10770 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
10780 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
10790 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
107a0 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
107b0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
107c0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
107d0 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
107e0 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
107f0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
10800 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
10810 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
10820 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
10830 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
10840 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
10850 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
10860 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
10870 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
10880 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
10890 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
108a0 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
108b0 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
108c0 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
108d0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
108e0 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
108f0 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
10900 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
10910 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
10920 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
10930 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
10940 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
10950 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
10960 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
10970 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
10980 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
10990 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
109a0 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
109b0 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
109c0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
109d0 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 45  et;.  int n;.  E
109e0 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
109f0 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28 20  >pLimit;..  if( 
10a00 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75  p->iLimit ) retu
10a10 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rn;..  /* .  ** 
10a20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
10a30 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
10a40 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
10a50 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73  .  ** controvers
10a60 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
10a70 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
10a80 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
10a90 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
10aa0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
10ab0 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
10ac0 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
10ad0 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73  o rows..  */.  s
10ae0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
10af0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
10b00 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20  if( pLimit ){.  
10b10 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74    assert( pLimit
10b20 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20 29  ->op==TK_LIMIT )
10b30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
10b40 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20 29  imit->pLeft!=0 )
10b50 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  ;.    p->iLimit 
10b60 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
10b70 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
10b80 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
10b90 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  e(pParse);.    a
10ba0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
10bb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
10bc0 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69 6d  prIsInteger(pLim
10bd0 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20 29  it->pLeft, &n) )
10be0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10bf0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10c00 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d  Integer, n, iLim
10c10 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  it);.      VdbeC
10c20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
10c30 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
10c40 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
10c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10c60 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61  dbeGoto(v, iBrea
10c70 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  k);.      }else 
10c80 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e  if( n>=0 && p->n
10c90 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65  SelectRow>sqlite
10ca0 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20  3LogEst((u64)n) 
10cb0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
10cc0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
10cd0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
10ce0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c  ;.        p->sel
10cf0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65  Flags |= SF_Fixe
10d00 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a  dLimit;.      }.
10d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10d20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10d30 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d  (pParse, pLimit-
10d40 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29 3b  >pLeft, iLimit);
10d50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10d60 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
10d70 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74  ustBeInt, iLimit
10d80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
10d90 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
10da0 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
10db0 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
10dc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10dd0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
10de0 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
10df0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
10e00 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  v);.    }.    if
10e10 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  ( pLimit->pRight
10e20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
10e30 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
10e40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
10e50 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
10e60 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
10e70 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
10e80 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
10e90 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  +offset */.     
10ea0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10eb0 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d  (pParse, pLimit-
10ec0 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65 74  >pRight, iOffset
10ed0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10ee0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10ef0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66  _MustBeInt, iOff
10f00 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
10f10 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
10f20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
10f30 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
10f40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10f50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
10f60 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d  ffsetLimit, iLim
10f70 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69  it, iOffset+1, i
10f80 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56  Offset);.      V
10f90 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10fa0 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b  LIMIT+OFFSET"));
10fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
10fc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10fd0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
10fe0 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
10ff0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
11000 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
11010 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
11020 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
11030 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
11040 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
11050 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
11060 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
11070 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
11080 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
11090 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
110a0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
110b0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
110c0 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
110d0 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
110e0 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
110f0 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
11100 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
11110 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
11120 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
11130 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
11140 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
11150 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
11160 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
11170 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
11180 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
11190 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
111a0 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
111b0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
111c0 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
111d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
111e0 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
111f0 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
11200 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73  );.  /* iCol mus
11210 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70  t be less than p
11220 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e  ->pEList->nExpr.
11230 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65    Otherwise an e
11240 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  rror would.  ** 
11250 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e  have been thrown
11260 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73   during name res
11270 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77  olution and we w
11280 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f  ould not have go
11290 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66  tten.  ** this f
112a0 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74  ar */.  if( pRet
112b0 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  ==0 && ALWAYS(iC
112c0 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ol<p->pEList->nE
112d0 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74  xpr) ){.    pRet
112e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
112f0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
11300 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
11310 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
11320 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
11330 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
11340 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
11350 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
11360 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f  arameter is a co
11370 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a  mpound SELECT.**
11380 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
11390 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66  Y clause. This f
113a0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
113b0 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
113c0 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  KeyInfo.** struc
113d0 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f  ture suitable fo
113e0 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  r implementing t
113f0 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a  he ORDER BY..**.
11400 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
11410 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
11420 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
11430 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
11440 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
11450 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
11460 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72  nsible for ensur
11470 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
11480 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
11490 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
114a0 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
114b0 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  o *multiSelectOr
114c0 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72  derByKeyInfo(Par
114d0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
114e0 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72  ct *p, int nExtr
114f0 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  a){.  ExprList *
11500 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
11510 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f  rderBy;.  int nO
11520 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
11530 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73  erBy->nExpr;.  s
11540 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11550 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e  rse->db;.  KeyIn
11560 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  fo *pRet = sqlit
11570 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
11580 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74  b, nOrderBy+nExt
11590 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52  ra, 1);.  if( pR
115a0 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
115b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
115c0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
115d0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
115e0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
115f0 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61  m = &pOrderBy->a
11600 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20  [i];.      Expr 
11610 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e  *pTerm = pItem->
11620 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c  pExpr;.      Col
11630 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
11640 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
11650 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
11660 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  e ){.        pCo
11670 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
11680 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11690 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  pTerm);.      }e
116a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
116b0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
116c0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
116d0 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  p, pItem->u.x.iO
116e0 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20  rderByCol-1);.  
116f0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
11700 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  =0 ) pColl = db-
11710 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
11720 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
11730 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20  i].pExpr =.     
11740 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11750 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
11760 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
11770 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
11780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
11790 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
117a0 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
117b0 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52  Ret) );.      pR
117c0 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  et->aColl[i] = p
117d0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74  Coll;.      pRet
117e0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
117f0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
11800 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
11810 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
11820 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pRet;.}..#ifndef
11830 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
11840 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11850 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44  ine generates VD
11860 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  BE code to compu
11870 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  te the content o
11880 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49  f a WITH RECURSI
11890 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74  VE.** query of t
118a0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
118b0 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c   <recursive-tabl
118c0 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75  e> AS (<setup-qu
118d0 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  ery> UNION [ALL]
118e0 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72   <recursive-quer
118f0 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  y>).**          
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
11910 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
11920 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
11930 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
11960 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
11970 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a         p.**.**.*
11980 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  * There is exact
11990 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  ly one reference
119a0 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76   to the recursiv
119b0 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e-table in the F
119c0 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66  ROM clause.** of
119d0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
119e0 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68  , marked with th
119f0 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66  e SrcList->a[].f
11a00 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c  g.isRecursive fl
11a10 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ag..**.** The se
11a20 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f  tup-query runs o
11a30 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  nce to generate 
11a40 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f  an initial set o
11a50 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a  f rows that go.*
11a60 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74  * into a Queue t
11a70 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20  able.  Rows are 
11a80 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
11a90 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f  he Queue table o
11aa0 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45  ne by.** one.  E
11ab0 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65  ach row extracte
11ac0 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20  d from Queue is 
11ad0 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
11ae0 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c    Then the singl
11af0 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72  e.** extracted r
11b00 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69  ow (now in the i
11b10 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62  Current table) b
11b20 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65  ecomes the conte
11b30 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63  nt of the.** rec
11b40 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72  ursive-table for
11b50 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65   a recursive-que
11b60 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74  ry run.  The out
11b70 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72  put of the recur
11b80 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73  sive-query.** is
11b90 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f   added back into
11ba0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11bb0 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20  .  Then another 
11bc0 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64  row is extracted
11bd0 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61   from Queue.** a
11be0 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  nd the iteration
11bf0 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c   continues until
11c00 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11c10 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
11c20 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   If the compound
11c30 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20   query operator 
11c40 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f  is UNION then no
11c50 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
11c60 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65  are ever.** inse
11c70 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75  rted into the Qu
11c80 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  eue table.  The 
11c90 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20  iDistinct table 
11ca0 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20  keeps a copy of 
11cb0 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74  all rows.** that
11cc0 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20   have ever been 
11cd0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75  inserted into Qu
11ce0 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64  eue and causes d
11cf0 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a  uplicates to be.
11d00 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  ** discarded.  I
11d10 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69  f the operator i
11d20 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65  s UNION ALL, the
11d30 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65  n duplicates are
11d40 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a   allowed..** .**
11d50 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61   If the query ha
11d60 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  s an ORDER BY, t
11d70 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74  hen entries in t
11d80 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61  he Queue table a
11d90 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52  re kept in.** OR
11da0 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64  DER BY order and
11db0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
11dc0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f   is extracted fo
11dd0 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57  r each cycle.  W
11de0 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44  ithout.** an ORD
11df0 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65  ER BY, the Queue
11e00 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61   table is just a
11e10 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FIFO..**.** If 
11e20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69  a LIMIT clause i
11e30 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e  s provided, then
11e40 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73   the iteration s
11e50 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54  tops after LIMIT
11e60 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65   rows.** have be
11e70 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  en output to pDe
11e80 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20  st.  A LIMIT of 
11e90 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75  zero means to ou
11ea0 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64  tput no rows and
11eb0 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c   a.** negative L
11ec0 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75  IMIT means to ou
11ed0 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20  tput all rows.  
11ee0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f  If there is also
11ef0 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
11f00 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69  e.** with a posi
11f10 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e  tive value, then
11f20 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
11f30 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69  T outputs are di
11f40 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a  scarded rather.*
11f50 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e  * than being sen
11f60 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65  t to pDest.  The
11f70 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65   LIMIT count doe
11f80 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69  s not begin unti
11f90 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a  l after OFFSET.*
11fa0 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  * rows have been
11fb0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
11fc0 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
11fd0 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
11fe0 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
11ff0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
12000 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
12010 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
12020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12030 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
12040 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  CT to be coded *
12050 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
12060 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
12070 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
12080 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
12090 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
120a0 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20   = p->pSrc;     
120b0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
120c0 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72  use of the recur
120d0 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
120e0 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45  int nCol = p->pE
120f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a  List->nExpr;  /*
12100 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
12110 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  ns in the recurs
12120 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56  ive table */.  V
12130 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
12140 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
12150 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
12160 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
12170 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  struction */.  S
12180 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20  elect *pSetup = 
12190 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20  p->pPrior;   /* 
121a0 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20  The setup query 
121b0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
121c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
121d0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
121e0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
121f0 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
12200 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54  ak;      /* CONT
12210 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61  INUE and BREAK a
12220 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e  ddresses */.  in
12230 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
12240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12250 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
12260 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72   */.  int regCur
12270 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
12280 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
12290 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20  holding Current 
122a0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
122b0 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20  Queue;          
122c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
122d0 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
122e0 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d   int iDistinct =
122f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
12300 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71  * To ensure uniq
12310 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e  ue results if UN
12320 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ION */.  int eDe
12330 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20  st = SRT_Fifo;  
12340 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
12350 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20   write to Queue 
12360 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12370 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20  destQueue;      
12380 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74     /* SelectDest
12390 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20   targetting the 
123a0 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
123b0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
123d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
123e0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12400 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
12410 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
12420 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
12430 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
12440 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
12450 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12470 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64   Saved LIMIT and
12480 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74   OFFSET */.  int
12490 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66   regLimit, regOf
124a0 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65  fset;      /* Re
124b0 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20  gisters used by 
124c0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
124d0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
124e0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
124f0 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65  o do a recursive
12500 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
12510 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
12520 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
12530 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c  RECURSIVE, 0, 0,
12540 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
12550 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
12560 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
12570 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65   clauses, if the
12580 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64  y exist */.  add
12590 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
125a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
125b0 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ;.  p->nSelectRo
125c0 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62  w = 320;  /* 4 b
125d0 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20  illion rows */. 
125e0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
125f0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
12600 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
12610 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
12620 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d  it;.  regLimit =
12630 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65   p->iLimit;.  re
12640 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  gOffset = p->iOf
12650 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  fset;.  p->pLimi
12660 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d  t = 0;.  p->iLim
12670 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20  it = p->iOffset 
12680 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  = 0;.  pOrderBy 
12690 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
126a0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
126b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
126c0 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   the Current tab
126d0 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  le */.  for(i=0;
126e0 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e   ALWAYS(i<pSrc->
126f0 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  nSrc); i++){.   
12700 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e   if( pSrc->a[i].
12710 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29  fg.isRecursive )
12720 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e 74  {.      iCurrent
12730 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43   = pSrc->a[i].iC
12740 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65  ursor;.      bre
12750 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
12760 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72   /* Allocate cur
12770 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72  sors numbers for
12780 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74 69   Queue and Disti
12790 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nct.  The cursor
127a0 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a   number for.  **
127b0 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74 61   the Distinct ta
127c0 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61 63  ble must be exac
127d0 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20  tly one greater 
127e0 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72  than Queue in or
127f0 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  der.  ** for the
12800 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e   SRT_DistFifo an
12810 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  d SRT_DistQueue 
12820 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20  destinations to 
12830 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75  work. */.  iQueu
12840 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
12850 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ++;.  if( p->op=
12860 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
12870 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
12880 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75  y ? SRT_DistQueu
12890 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f  e : SRT_DistFifo
128a0 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20  ;.    iDistinct 
128b0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
128c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  ;.  }else{.    e
128d0 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
128e0 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52  ? SRT_Queue : SR
128f0 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71  T_Fifo;.  }.  sq
12900 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
12910 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20  nit(&destQueue, 
12920 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a  eDest, iQueue);.
12930 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
12940 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65  ursors for Curre
12950 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44  nt, Queue, and D
12960 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65  istinct. */.  re
12970 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61  gCurrent = ++pPa
12980 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
12990 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
129a0 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
129b0 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75   iCurrent, regCu
129c0 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rrent, nCol);.  
129d0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
129e0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
129f0 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c  yInfo = multiSel
12a00 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
12a10 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
12a20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12a30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
12a40 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
12a50 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
12a60 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
12a90 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
12aa0 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64    destQueue.pOrd
12ab0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
12ac0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
12ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12ae0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
12af0 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f  ral, iQueue, nCo
12b00 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f  l);.  }.  VdbeCo
12b10 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65  mment((v, "Queue
12b20 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28   table"));.  if(
12b30 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20   iDistinct ){.  
12b40 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
12b50 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  m[0] = sqlite3Vd
12b60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
12b70 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44  penEphemeral, iD
12b80 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20  istinct, 0);.   
12b90 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
12ba0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
12bb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61  ;.  }..  /* Deta
12bc0 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
12bd0 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
12be0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
12bf0 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
12c00 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72   = 0;..  /* Stor
12c10 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
12c20 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   the setup-query
12c30 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20   in Queue. */.  
12c40 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
12c50 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
12c60 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
12c70 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65  pSetup, &destQue
12c80 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70  ue);.  pSetup->p
12c90 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20  Next = p;.  if( 
12ca0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  rc ) goto end_of
12cb0 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
12cc0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
12cd0 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
12ce0 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75   Queue and outpu
12cf0 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20  t that row */.  
12d00 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
12d10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12d20 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65  P_Rewind, iQueue
12d30 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64  , addrBreak); Vd
12d40 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
12d50 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
12d60 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75  e next row in Qu
12d70 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72  eue over to Curr
12d80 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
12d90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12da0 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65  _NullRow, iCurre
12db0 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74  nt); /* To reset
12dc0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f   column cache */
12dd0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
12de0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12df0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
12e00 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70  olumn, iQueue, p
12e10 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
12e20 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
12e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
12e40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12e50 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75   OP_RowData, iQu
12e60 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29  eue, regCurrent)
12e70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
12e80 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12e90 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b  Delete, iQueue);
12ea0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
12eb0 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
12ec0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64  Current */.  add
12ed0 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
12ee0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
12ef0 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
12f00 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72   regOffset, addr
12f10 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49  Cont);.  selectI
12f20 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
12f30 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20   p, iCurrent,.  
12f40 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
12f50 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
12f60 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
12f70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
12f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12f90 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
12fa0 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
12fb0 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
12fc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12fd0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
12fe0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
12ff0 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
13000 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
13010 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
13020 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
13030 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
13040 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
13050 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
13060 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
13070 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
13080 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
13090 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
130a0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
130b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
130c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
130d0 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61  ecursive aggrega
130e0 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73  te queries not s
130f0 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65  upported");.  }e
13100 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  lse{.    p->pPri
13110 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  or = 0;.    sqli
13120 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
13130 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  , p, &destQueue)
13140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
13150 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
13160 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53    p->pPrior = pS
13170 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  etup;.  }..  /* 
13180 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65  Keep running the
13190 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20   loop until the 
131a0 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a  Queue is empty *
131b0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  /.  sqlite3VdbeG
131c0 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  oto(v, addrTop);
131d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
131e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
131f0 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f  drBreak);..end_o
13200 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
13210 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  y:.  sqlite3Expr
13220 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
13230 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
13240 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72  By);.  p->pOrder
13250 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
13260 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
13270 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  mit;.  return;.}
13280 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13290 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
132a0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
132b0 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
132c0 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
132d0 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
132e0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
132f0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13300 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
13310 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13320 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
13330 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
13340 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
13350 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
13360 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
13370 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
13380 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48  s */.);../*.** H
13390 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61  andle the specia
133a0 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70  l case of a comp
133b0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
133c0 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
133d0 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61   a.** VALUES cla
133e0 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e  use.  By handlin
133f0 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  g this as a spec
13400 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f  ial case, we avo
13410 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72  id deep.** recur
13420 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64  sion, and thus d
13430 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e  o not need to en
13440 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45  force the SQLITE
13450 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
13460 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56  SELECT.** on a V
13470 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a  ALUES clause..**
13480 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20  .** Because the 
13490 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72  Select object or
134a0 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20  iginates from a 
134b0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a  VALUES clause:.*
134c0 2a 20 20 20 28 31 29 20 54 68 65 72 65 20 69 73  *   (1) There is
134d0 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46   no LIMIT or OFF
134e0 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65 72  SET or else ther
134f0 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66 20  e is a LIMIT of 
13500 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20 28  exactly 1.**   (
13510 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65  2) All terms are
13520 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20   UNION ALL.**   
13530 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20  (3) There is no 
13540 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
13550 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49 54  **.** The "LIMIT
13560 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20 63   of exactly 1" c
13570 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e  ase of condition
13580 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75 74   (1) comes about
13590 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a 2a   when a VALUES.*
135a0 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73 20  * clause occurs 
135b0 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65 78  within scalar ex
135c0 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22 53  pression (ex: "S
135d0 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31 29  ELECT (VALUES(1)
135e0 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a 20  ,(2),(3))")..** 
135f0 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65 53  The sqlite3CodeS
13600 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68 61  ubselect will ha
13610 76 65 20 61 64 64 65 64 20 74 68 65 20 4c 49 4d  ve added the LIM
13620 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20 74  IT 1 clause in t
13630 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e 63  ht case..** Sinc
13640 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20 65  e the limit is e
13650 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e 6c  xactly 1, we onl
13660 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75 74  y need to evalut
13670 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  es the left-most
13680 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61 74   VALUES..*/.stat
13690 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
136a0 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73  ctValues(.  Pars
136b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
136c0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
136d0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
136e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
136f0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
13700 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
13710 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
13720 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
13730 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
13740 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
13750 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ults */.){.  Sel
13760 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 53  ect *pPrior;.  S
13770 65 6c 65 63 74 20 2a 70 52 69 67 68 74 6d 6f 73  elect *pRightmos
13780 74 20 3d 20 70 3b 0a 20 20 69 6e 74 20 6e 52 6f  t = p;.  int nRo
13790 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20  w = 1;.  int rc 
137a0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
137b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
137c0 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20  MultiValue );.  
137d0 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
137e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
137f0 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61  _Values );.    a
13800 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
13810 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d  _ALL || (p->op==
13820 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e  TK_SELECT && p->
13830 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20  pPrior==0) );.  
13840 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
13850 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69  xt==0 || p->pELi
13860 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e  st->nExpr==p->pN
13870 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ext->pEList->nEx
13880 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  pr );.    if( p-
13890 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65  >pPrior==0 ) bre
138a0 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
138b0 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  p->pPrior->pNext
138c0 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70  ==p );.    p = p
138d0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52  ->pPrior;.    nR
138e0 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31  ow++;.  }while(1
138f0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
13900 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  .    pPrior = p-
13910 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
13920 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
13930 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
13940 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  ct(pParse, p, pD
13950 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  est);.    p->pPr
13960 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
13970 20 20 69 66 28 20 72 63 20 7c 7c 20 70 52 69 67    if( rc || pRig
13980 68 74 6d 6f 73 74 2d 3e 70 4c 69 6d 69 74 20 29  htmost->pLimit )
13990 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e   break;.    p->n
139a0 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77  SelectRow = nRow
139b0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  ;.    p = p->pNe
139c0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
139d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
139e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
139f0 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
13a00 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
13a10 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77   form from.** tw
13a20 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
13a30 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67  te queries using
13a40 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c   UNION, UNION AL
13a50 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a  L, EXCEPT, or.**
13a60 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a   INTERSECT.**.**
13a70 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
13a80 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
13a90 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
13aa0 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
13ab0 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
13ac0 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
13ad0 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
13ae0 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
13af0 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
13b00 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
13b10 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
13b20 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
13b30 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
13b40 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
13b50 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
13b60 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
13b70 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
13b80 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
13b90 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
13ba0 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
13bb0 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
13bc0 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
13bd0 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
13be0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
13bf0 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
13c00 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
13c10 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
13c20 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
13c30 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
13c40 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
13c50 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
13c60 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
13c70 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
13c80 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
13c90 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
13ca0 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
13cb0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
13cc0 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
13cd0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
13ce0 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
13cf0 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
13d00 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
13d10 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
13d20 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
13d30 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
13d40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
13d50 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
13d60 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
13d70 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
13d80 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
13d90 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
13da0 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
13db0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
13dc0 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
13dd0 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
13de0 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
13df0 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
13e00 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
13e10 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
13e20 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
13e30 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
13e40 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
13e50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13e60 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
13e70 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
13e80 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
13e90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
13ea0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
13eb0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
13ec0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
13ed0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
13ee0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
13ef0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
13f00 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13f10 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
13f20 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
13f30 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
13f40 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
13f50 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
13f60 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
13f70 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
13f80 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13fa0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
13fb0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
13fc0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
13fd0 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
13fe0 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e  tive data destin
13ff0 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ation */.  Selec
14000 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
14010 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d   /* Chain of sim
14020 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64  ple selects to d
14030 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  elete */.  sqlit
14040 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
14050 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
14060 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64  nection */.#ifnd
14070 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
14080 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
14090 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  b1 = 0;        /
140a0 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
140b0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
140c0 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20   int iSub2 = 0; 
140d0 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
140e0 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
140f0 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
14100 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
14110 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
14120 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
14130 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
14140 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
14150 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
14160 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
14170 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
14180 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
14190 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
141a0 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
141b0 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20  ->pPrior );  /* 
141c0 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  Calling function
141d0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
141e0 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72   much */.  asser
141f0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
14200 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
14210 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  =0 || p->op==TK_
14220 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ALL || p->op==TK
14230 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d  _UNION );.  db =
14240 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
14250 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
14260 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65  r;.  dest = *pDe
14270 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  st;.  if( pPrior
14280 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50  ->pOrderBy || pP
14290 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
142a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
142b0 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 63  Msg(pParse,"%s c
142c0 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
142d0 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
142e0 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50  efore",.      pP
142f0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d  rior->pOrderBy!=
14300 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a  0 ? "ORDER BY" :
14310 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74   "LIMIT", select
14320 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
14330 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
14340 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14350 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
14360 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
14370 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
14380 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
14390 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
143a0 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
143b0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
143c0 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
143d0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
143e0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
143f0 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
14400 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
14410 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
14420 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
14430 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
14440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14450 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
14460 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72  ral, dest.iSDPar
14470 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  m, p->pEList->nE
14480 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65  xpr);.    dest.e
14490 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
144a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
144b0 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72  ial handling for
144c0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65   a compound-sele
144d0 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  ct that originat
144e0 65 73 20 61 73 20 61 20 56 41 4c 55 45 53 20 63  es as a VALUES c
144f0 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
14500 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
14510 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b  SF_MultiValue ){
14520 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
14530 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61 72  electValues(pPar
14540 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
14550 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14560 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
14570 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
14580 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
14590 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
145a0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
145b0 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
145c0 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
145d0 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
145e0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
145f0 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
14600 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
14610 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
14620 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
14630 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64  >nExpr );..#ifnd
14640 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
14650 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  TE.  if( p->selF
14660 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
14670 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ive ){.    gener
14680 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
14690 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
146a0 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   &dest);.  }else
146b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
146c0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
146d0 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
146e0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
146f0 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
14700 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
14710 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
14720 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
14730 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
14740 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
14750 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e   }else..  /* Gen
14760 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
14770 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
14780 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
14790 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
147a0 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
147b0 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
147c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
147d0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
147e0 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65  imit;.      asse
147f0 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
14800 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72  mit );.      pPr
14810 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d  ior->iLimit = p-
14820 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
14830 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d  Prior->iOffset =
14840 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20   p->iOffset;.   
14850 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
14860 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
14870 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
14880 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
14890 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
148a0 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
148b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
148c0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
148d0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
148e0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
148f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14900 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14910 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
14920 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
14930 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
14940 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
14950 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
14960 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
14970 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
14980 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
14990 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  t ){.        add
149a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
149b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
149c0 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56  t, p->iLimit); V
149d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
149e0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
149f0 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
14a00 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
14a10 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  ched"));.       
14a20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20   if( p->iOffset 
14a30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
14a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14a50 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
14a60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
14a80 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66  >iLimit, p->iOff
14a90 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65  set+1, p->iOffse
14aa0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
14ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c      }.      expl
14ac0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14ad0 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
14ae0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14af0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14b00 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14b10 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74   &dest);.      t
14b20 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14b30 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
14b40 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
14b50 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
14b60 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
14b70 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
14b80 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
14b90 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
14ba0 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
14bb0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
14bc0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
14bd0 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  it.       && sql
14be0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
14bf0 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
14c00 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74  ->pLeft, &nLimit
14c10 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d  ).       && nLim
14c20 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  it>0 && p->nSele
14c30 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c  ctRow > sqlite3L
14c40 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69  ogEst((u64)nLimi
14c50 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  t) .      ){.   
14c60 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
14c70 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
14c80 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b  st((u64)nLimit);
14c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14ca0 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
14cb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14cc0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
14cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
14ce0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14cf0 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
14d00 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
14d10 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
14d20 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
14d30 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
14d40 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14d50 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
14d60 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f  lt */.      u8 o
14d70 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  p = 0;       /* 
14d80 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
14d90 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
14da0 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
14db0 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
14dc0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
14dd0 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
14de0 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
14df0 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
14e00 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
14e10 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
14e20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f  of p->nLimit  */
14e30 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
14e40 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
14e50 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
14e60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
14e70 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
14e80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14e90 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
14ea0 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  N );.      prior
14eb0 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  Op = SRT_Union;.
14ec0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
14ed0 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest==priorOp ){
14ee0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
14ef0 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
14f00 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
14f10 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
14f20 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
14f30 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
14f40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
14f50 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
14f60 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74  0 );      /* Not
14f70 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
14f80 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
14f90 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
14fa0 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  b = dest.iSDParm
14fb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14fc0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
14fd0 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
14fe0 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
14ff0 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
15000 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
15010 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
15020 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
15030 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
15040 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
15050 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
15060 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
15070 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
15080 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
15090 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
150a0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
150b0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
150c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
150d0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
150e0 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
150f0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
15100 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
15110 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
15120 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
15130 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
15140 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15150 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
15160 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
15170 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
15180 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
15190 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
151a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
151b0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
151c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
151d0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
151e0 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
151f0 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
15200 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15210 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
15220 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15230 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15240 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15250 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
15260 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
15270 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
15280 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
15290 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
152a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
152b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
152c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
152d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
152e0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
152f0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  PT ){.        op
15300 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20   = SRT_Except;. 
15310 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15320 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
15330 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
15340 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
15350 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  Union;.      }. 
15360 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
15370 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
15380 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
15390 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
153a0 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
153b0 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
153c0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
153d0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
153e0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
153f0 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15400 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15410 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
15420 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
15430 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
15440 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
15450 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
15460 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
15470 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
15480 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
15490 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
154a0 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
154b0 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
154c0 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
154d0 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
154e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
154f0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
15500 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
15510 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
15520 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
15530 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
15540 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
15550 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
15560 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
15570 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
15580 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
15590 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
155a0 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
155b0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
155c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
155d0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
155e0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
155f0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
15600 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
15610 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->iLimit = 0;.
15620 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
15630 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
15640 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
15650 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
15660 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
15670 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
15680 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
15690 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
156a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
156b0 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61   assert( unionTa
156c0 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20  b==dest.iSDParm 
156d0 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  || dest.eDest!=p
156e0 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20  riorOp );.      
156f0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
15700 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
15710 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
15720 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
15730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15740 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
15750 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
15760 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15770 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
15780 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
15790 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
157a0 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
157b0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
157c0 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
157d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
157e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
157f0 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
15800 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
15810 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15820 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
15830 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15840 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
15850 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
15860 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e  pParse, p, union
15870 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
15890 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
158a0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
158b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
158c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
158d0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
158e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
158f0 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
15900 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64  Tab, iStart); Vd
15910 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15930 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15940 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
15950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15960 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
15970 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
15980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
15990 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
159a0 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
159b0 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  p->op==TK_INTERS
159c0 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ECT ); {.      i
159d0 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
159e0 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
159f0 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
15a00 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
15a10 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  it;.      int ad
15a20 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
15a30 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65  Dest intersectde
15a40 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  st;.      int r1
15a50 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
15a60 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
15a70 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
15a80 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
15a90 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
15aa0 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
15ab0 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
15ac0 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
15ad0 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
15ae0 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
15af0 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
15b00 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
15b10 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
15b20 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
15b30 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
15b40 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
15b50 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
15b60 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rBy==0 );..     
15b70 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15b80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b90 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
15ba0 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
15bb0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
15bc0 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
15bd0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
15be0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
15bf0 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69  dr;.      findRi
15c00 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
15c10 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
15c20 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
15c30 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15c40 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
15c50 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
15c60 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
15c70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15c80 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
15c90 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
15ca0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
15cb0 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
15cc0 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
15cd0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
15ce0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
15cf0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
15d00 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
15d10 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
15d20 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
15d30 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
15d40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
15d50 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
15d60 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
15d70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
15d80 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
15d90 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
15da0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
15db0 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
15dc0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
15dd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15de0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
15df0 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
15e00 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
15e10 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
15e20 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
15e30 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
15e40 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
15e50 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
15e60 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
15e70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
15e80 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
15e90 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e    intersectdest.
15ea0 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  iSDParm = tab2;.
15eb0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
15ec0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
15ed0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
15ee0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
15ef0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
15f00 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
15f10 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
15f20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
15f30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
15f40 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
15f50 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
15f60 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
15f70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
15f80 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72  SelectRow>pPrior
15f90 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
15fa0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
15fb0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
15fc0 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
15fd0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
15fe0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
15ff0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
16000 6d 69 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  mit;..      /* G
16010 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
16020 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
16030 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
16040 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
16050 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
16060 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
16070 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
16080 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
16090 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
160a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
160b0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
160c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
160d0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
160e0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
160f0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
16100 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16110 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
16120 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
16130 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
16140 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  (v);.      r1 = 
16150 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16160 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16170 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
16180 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16190 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c  P_RowData, tab1,
161a0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
161b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
161c0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
161d0 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
161e0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
161f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
16200 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16210 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
16220 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
16230 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
16240 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20   tab1,.         
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
16260 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
16270 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
16280 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
16290 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
162a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
162b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
162c0 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
162d0 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
162e0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
162f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16300 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
16310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16320 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
16330 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
16340 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16350 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
16360 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
16370 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16380 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
16390 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
163a0 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
163b0 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
163c0 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
163d0 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
163e0 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
163f0 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
16400 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
16410 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
16420 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
16430 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
16440 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
16450 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
16460 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
16470 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
16480 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
16490 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
164a0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
164b0 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
164c0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
164d0 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
164e0 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
164f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
16500 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
16510 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
16520 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
16530 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
16540 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
16550 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
16560 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
16570 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
16580 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
16590 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
165c0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
165d0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
165e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
165f0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
16600 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
16610 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
16620 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
16630 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
16640 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
16650 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
16660 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
16670 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
16680 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
16690 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
166a0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
166b0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
166e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
166f0 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
16700 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
16710 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =0 );.    nCol =
16720 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
16730 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
16740 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
16750 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20  Alloc(db, nCol, 
16760 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  1);.    if( !pKe
16770 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
16780 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
16790 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
167a0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
167b0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
167c0 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
167d0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
167e0 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
167f0 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
16800 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
16810 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
16820 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
16830 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
16840 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
16850 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
16860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16870 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
16880 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
16890 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
168a0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
168b0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
168c0 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
168d0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
168e0 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
168f0 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
16900 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
16910 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
16920 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
16930 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
16940 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
16950 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
16960 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
16970 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
16980 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
16990 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
169a0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
169b0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
169c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
169d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
169e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
169f0 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
16a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16a10 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
16a20 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
16a30 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
16a40 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
16a70 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
16a80 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
16a90 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
16aa0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
16ab0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
16ac0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
16ad0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
16ae0 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
16af0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
16b00 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
16b10 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
16b20 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
16b30 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
16b40 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
16b50 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16b60 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
16b70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72   */../*.** Error
16b80 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68 65   message for whe
16b90 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65  n two or more te
16ba0 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  rms of a compoun
16bb0 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64 69  d select have di
16bc0 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20  fferent.** size 
16bd0 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a  result sets..*/.
16be0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
16bf0 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45  ctWrongNumTermsE
16c00 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
16c10 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
16c20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
16c30 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b  s & SF_Values ){
16c40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16c50 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
16c60 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
16c70 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
16c80 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
16c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
16ca0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16cb0 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
16cc0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
16cd0 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
16ce0 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
16cf0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
16d00 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
16d10 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
16d20 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->op));.  }.}../
16d30 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74  *.** Code an out
16d40 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66  put subroutine f
16d50 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69  or a coroutine i
16d60 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
16d70 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
16d80 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tment..**.** The
16d90 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70   data to be outp
16da0 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ut is contained 
16db0 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20  in pIn->iSdst.  
16dc0 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e  There are.** pIn
16dd0 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20  ->nSdst columns 
16de0 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70  to be output.  p
16df0 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68  Dest is where th
16e00 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a  e output should.
16e10 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a  ** be sent..**.*
16e20 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74  * regReturn is t
16e30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
16e40 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
16e50 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
16e60 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65  .** return addre
16e70 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  ss..**.** If reg
16e80 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69  Prev>0 then it i
16e90 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  s the first regi
16ea0 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
16eb0 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
16ec0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
16ed0 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
16ee0 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
16ef0 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
16f00 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
16f10 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
16f20 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
16f30 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
16f40 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
16f50 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
16f60 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
16f70 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
16f80 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
16f90 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
16fa0 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
16fb0 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
16fc0 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
16fd0 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
16fe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
16ff0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
17000 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
17010 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
17020 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
17030 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
17040 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17050 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
17060 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
17070 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
17080 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
17090 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
170a0 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
170b0 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
170c0 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
170d0 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
170e0 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
170f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
17100 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
17110 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
17120 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
17130 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
17140 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
17150 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
17160 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
17170 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
17180 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
17190 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
171a0 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42  ntry */.  int iB
171b0 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
171c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
171d0 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d  f we hit the LIM
171e0 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  IT */.){.  Vdbe 
171f0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
17200 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69  be;.  int iConti
17210 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  nue;.  int addr;
17220 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ..  addr = sqlit
17230 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17240 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75  r(v);.  iContinu
17250 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
17260 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
17270 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c  /* Suppress dupl
17280 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e  icates for UNION
17290 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
172a0 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20  TERSECT .  */.  
172b0 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20  if( regPrev ){. 
172c0 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
172d0 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  dr2;.    addr1 =
172e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
172f0 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
17300 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f  regPrev); VdbeCo
17310 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61  verage(v);.    a
17320 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
17330 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
17340 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64  ompare, pIn->iSd
17350 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
17360 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20  In->nSdst,.     
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
17390 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
173a0 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
173b0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
173c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
173d0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
173e0 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  2+2, iContinue, 
173f0 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f  addr2+2); VdbeCo
17400 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
17410 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17420 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
17430 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17440 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
17450 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
17460 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
17470 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t-1);.    sqlite
17480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17490 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
174a0 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66  gPrev);.  }.  if
174b0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
174c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
174d0 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70  urn 0;..  /* Sup
174e0 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20  press the first 
174f0 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69  OFFSET entries i
17500 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46  f there is an OF
17510 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FSET clause.  */
17520 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
17530 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
17540 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65  ntinue);..  asse
17550 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
17560 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a  !=SRT_Exists );.
17570 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
17580 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c  >eDest!=SRT_Tabl
17590 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  e );.  switch( p
175a0 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20  Dest->eDest ){. 
175b0 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
175c0 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
175d0 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
175e0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
175f0 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
17600 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
17610 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17620 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
17630 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
17640 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17650 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
17660 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17670 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
17680 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
17690 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20  ->nSdst, r1);.  
176a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
176b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
176c0 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  owid, pDest->iSD
176d0 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
176e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
176f0 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
17700 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
17710 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
17720 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17730 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
17740 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c  PEND);.      sql
17750 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17760 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
17770 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
17780 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17790 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
177a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
177b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
177c0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
177d0 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
177e0 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
177f0 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
17800 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a  T ...)"..    */.
17810 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
17820 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
17830 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17840 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29  ( pIn->nSdst>1 )
17850 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
17860 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17870 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
17880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17890 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
178a0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
178b0 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20 20  n->nSdst, .     
178c0 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
178d0 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  zAffSdst, pIn->n
178e0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
178f0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
17900 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
17910 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
17920 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17940 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
17950 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
17960 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20  iSDParm, r1,.   
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64          pIn->iSd
17990 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
179a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
179b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
179c0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
179d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
179e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
179f0 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
17a00 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
17a10 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
17a20 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
17a30 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
17a40 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
17a50 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
17a60 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
17a70 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
17a80 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
17a90 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
17aa0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
17ab0 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
17ac0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
17ad0 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
17ae0 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
17af0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17b00 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
17b10 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
17b20 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
17b30 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
17b40 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
17b50 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
17b60 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
17b70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
17b80 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
17b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
17ba0 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
17bb0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
17bc0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
17bd0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
17be0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
17bf0 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
17c00 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
17c10 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
17c20 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17c30 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
17c40 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
17c50 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
17c60 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
17c70 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
17c80 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
17c90 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17ca0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
17cb0 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
17cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17cd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
17ce0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
17cf0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
17d00 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
17d10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17d20 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17d30 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
17d40 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
17d50 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
17d60 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
17d70 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
17d80 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
17d90 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
17da0 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
17db0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
17dc0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
17dd0 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
17de0 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
17df0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
17e00 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
17e10 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
17e20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
17e30 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
17e40 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
17e50 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
17e60 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
17e70 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
17e80 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
17e90 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
17ea0 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
17eb0 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
17ec0 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
17ed0 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
17ee0 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
17ef0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
17f00 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
17f10 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
17f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17f30 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
17f40 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
17f50 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17f60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17f70 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
17f80 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
17f90 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17fa0 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
17fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17fc0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
17fd0 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
17fe0 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
17ff0 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
18000 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
18010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18020 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
18030 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  umpZero, p->iLim
18040 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
18050 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18060 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
18070 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
18080 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
18090 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
180a0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
180b0 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
180c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
180d0 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
180e0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
180f0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
18100 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
18110 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
18120 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
18130 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
18140 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
18150 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
18160 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
18170 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
18180 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
18190 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
181a0 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
181b0 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
181c0 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
181d0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
181e0 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
181f0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
18200 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
18210 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
18220 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
18230 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
18240 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
18250 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
18260 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
18270 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
18280 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
18290 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
182a0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
182b0 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
182c0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
182d0 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
182e0 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
182f0 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
18300 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
18310 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
18320 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
18330 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
18340 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
18350 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
18360 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
18370 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
18380 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
18390 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
183a0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
183b0 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
183c0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
183d0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
183e0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
183f0 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
18400 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
18410 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
18420 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
18430 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
18440 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
18450 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
18460 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
18470 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
18480 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
18490 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
184a0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
184b0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
184c0 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
184d0 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
184e0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
184f0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
18500 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
18510 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
18520 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
18530 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
18540 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
18550 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
18560 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
18570 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
18580 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
18590 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
185a0 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
185b0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
185c0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
185d0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
185e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
185f0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
18600 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
18610 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
18620 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
18630 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
18640 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
18650 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
18660 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
18670 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
18680 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
18690 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
186a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
186b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
186c0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
186d0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
186e0 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
186f0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
18700 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
18710 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
18720 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
18730 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
18740 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
18750 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
18760 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
18770 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
18780 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
18790 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
187a0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
187b0 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
187c0 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
187d0 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
187e0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
187f0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
18800 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
18810 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
18820 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
18830 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
18840 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
18850 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
18860 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
18870 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
18880 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
18890 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
188a0 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
188b0 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
188c0 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
188d0 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
188e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
188f0 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
18900 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
18910 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
18920 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
18930 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
18940 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
18950 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
18960 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
18970 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
18980 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
18990 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
189a0 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
189b0 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
189c0 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
189d0 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
189e0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
189f0 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
18a00 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
18a10 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
18a20 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
18a30 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
18a40 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
18a50 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
18a60 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
18a70 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
18a80 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
18a90 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
18aa0 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
18ab0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
18ac0 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
18ad0 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
18ae0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
18af0 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
18b00 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
18b10 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
18b20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
18b30 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
18b40 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
18b50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
18b60 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
18b70 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
18b80 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
18b90 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
18ba0 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
18bb0 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
18bc0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
18bd0 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
18be0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
18bf0 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
18c00 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
18c10 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
18c20 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
18c30 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
18c40 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
18c50 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
18c60 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
18c70 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
18c80 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
18c90 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
18ca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
18cb0 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
18cc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
18cd0 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
18ce0 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
18cf0 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
18d00 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
18d10 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
18d20 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
18d30 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
18d40 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
18d50 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
18d60 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
18d70 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
18d80 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
18d90 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
18da0 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
18db0 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
18dc0 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
18dd0 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
18de0 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
18df0 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
18e00 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
18e10 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
18e20 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
18e30 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
18e40 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
18e50 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
18e60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18e70 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
18e80 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
18e90 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
18ea0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
18eb0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
18ec0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
18ed0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
18ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18ef0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
18f00 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
18f10 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
18f20 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
18f30 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
18f40 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
18f50 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
18f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18f70 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
18f80 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
18f90 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
18fa0 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
18fb0 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
18fc0 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18fe0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
18ff0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
19000 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
19010 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
19020 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
19030 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
19040 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
19050 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
19060 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
19070 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
19080 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
19090 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
190a0 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
190b0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
190c0 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
190d0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
190e0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
190f0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
19100 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
19110 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19120 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
19130 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
19140 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
19150 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19160 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
19170 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
19180 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
19190 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
191a0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
191b0 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
191c0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
191d0 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
191e0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
191f0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
19200 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
19210 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
19220 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
19230 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
19240 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
19250 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
19260 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
19270 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
19280 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
19290 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
192a0 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
192b0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
192c0 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
192d0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
192e0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
192f0 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
19300 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
19310 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
19320 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
19330 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
19340 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19350 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
19360 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
19370 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
19380 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
19390 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
193a0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
193b0 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
193c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
193d0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
193e0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
193f0 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
19400 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19410 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
19420 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
19430 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
19440 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
19450 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
19460 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
19470 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
19480 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
19490 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
194a0 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
194b0 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
194c0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
194d0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
194e0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
194f0 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
19500 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
19510 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
19520 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
19530 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
19540 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
19550 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
19560 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
19570 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
19580 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
19590 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
195a0 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
195b0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
195c0 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
195d0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
195e0 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
195f0 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
19600 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
19610 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
19620 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
19630 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
19640 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
19650 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
19660 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
19670 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
19680 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
19690 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
196a0 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
196b0 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
196c0 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
196d0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
196e0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
196f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
19700 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
19710 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
19720 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
19730 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
19740 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
19750 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
19760 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
19770 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
19780 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
19790 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
197a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
197b0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
197c0 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
197d0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
197e0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
197f0 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
19800 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
19810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
19820 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
19830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
19840 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
19850 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
19860 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
19870 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
19880 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
19890 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
198a0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
198b0 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
198c0 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
198d0 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
198e0 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
198f0 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
19900 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
19910 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
19920 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
19930 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
19940 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
19950 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
19960 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
19970 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
19980 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19990 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
199a0 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
199b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
199c0 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
199d0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
199e0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
199f0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
19a00 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
19a10 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
19a20 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
19a30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
19a40 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
19a50 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
19a60 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
19a70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
19a80 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
19a90 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
19aa0 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
19ab0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
19ac0 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
19ad0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
19ae0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
19af0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
19b00 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
19b10 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
19b20 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
19b30 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
19b40 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
19b50 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
19b60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
19b70 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
19b80 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
19b90 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
19ba0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
19bb0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
19bc0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
19bd0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
19be0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
19bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
19c00 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
19c10 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
19c20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
19c30 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
19c40 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
19c50 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
19c60 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
19c70 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
19c80 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
19c90 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
19ca0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
19cb0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
19cc0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
19cd0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
19ce0 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
19cf0 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
19d00 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20  >u.iValue = i;. 
19d10 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
19d20 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20  By = pOrderBy = 
19d30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
19d40 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
19d50 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
19d60 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
19d70 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
19d80 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
19d90 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
19da0 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
19db0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19dc0 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
19dd0 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
19de0 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
19df0 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
19e00 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
19e10 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
19e20 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
19e30 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
19e40 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
19e50 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
19e60 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
19e70 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
19e80 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
19e90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19ea0 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
19eb0 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
19ec0 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
19ed0 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
19ee0 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
19ef0 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
19f00 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
19f10 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
19f20 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
19f30 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
19f40 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f   sizeof(int)*(nO
19f50 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20  rderBy + 1));.  
19f60 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
19f70 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
19f80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
19f90 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d  .    aPermute[0]
19fa0 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20   = nOrderBy;.   
19fb0 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d   for(i=1, pItem=
19fc0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d  pOrderBy->a; i<=
19fd0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70  nOrderBy; i++, p
19fe0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61  Item++){.      a
19ff0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
1a000 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
1a010 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a020 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
1a030 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69  erByCol<=p->pELi
1a040 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1a050 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d     aPermute[i] =
1a060 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
1a070 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  erByCol - 1;.   
1a080 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65   }.    pKeyMerge
1a090 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72   = multiSelectOr
1a0a0 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61  derByKeyInfo(pPa
1a0b0 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65  rse, p, 1);.  }e
1a0c0 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72  lse{.    pKeyMer
1a0d0 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ge = 0;.  }..  /
1a0e0 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f  * Reattach the O
1a0f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
1a100 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  o the query..  *
1a110 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
1a120 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50  = pOrderBy;.  pP
1a130 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rior->pOrderBy =
1a140 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a150 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
1a160 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20  pOrderBy, 0);.. 
1a170 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72   /* Allocate a r
1a180 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72  ange of temporar
1a190 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  y registers and 
1a1a0 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64  the KeyInfo need
1a1b0 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ed.  ** for the 
1a1c0 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76  logic that remov
1a1d0 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73  es duplicate res
1a1e0 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68  ult rows when th
1a1f0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20  e.  ** operator 
1a200 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  is UNION, EXCEPT
1a210 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28  , or INTERSECT (
1a220 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c  but not UNION AL
1a230 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  L)..  */.  if( o
1a240 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
1a250 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20   regPrev = 0;.  
1a260 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
1a270 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
1a280 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->nExpr;.    ass
1a290 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e  ert( nOrderBy>=n
1a2a0 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
1a2b0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1a2c0 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65  regPrev = pParse
1a2d0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
1a2e0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45  arse->nMem += nE
1a2f0 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74  xpr+1;.    sqlit
1a300 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a310 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
1a320 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65  egPrev);.    pKe
1a330 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65  yDup = sqlite3Ke
1a340 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
1a350 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  Expr, 1);.    if
1a360 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20  ( pKeyDup ){.   
1a370 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1a380 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
1a390 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b  able(pKeyDup) );
1a3a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1a3b0 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
1a3c0 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
1a3d0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69  aColl[i] = multi
1a3e0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
1a3f0 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
1a400 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
1a410 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b  ortOrder[i] = 0;
1a420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a430 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61   }. .  /* Separa
1a440 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  te the left and 
1a450 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20  the right query 
1a460 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72  from one another
1a470 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f  .  */.  p->pPrio
1a480 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d  r = 0;.  pPrior-
1a490 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71  >pNext = 0;.  sq
1a4a0 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
1a4b0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
1a4c0 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
1a4d0 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28   "ORDER");.  if(
1a4e0 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d   pPrior->pPrior=
1a4f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1a500 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
1a510 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72  upBy(pParse, pPr
1a520 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ior, pPrior->pOr
1a530 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1a540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
1a550 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  te the limit reg
1a560 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70  isters */.  comp
1a570 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
1a580 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62  s(pParse, p, lab
1a590 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d  elEnd);.  if( p-
1a5a0 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54  >iLimit && op==T
1a5b0 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
1a5c0 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73  LimitA = ++pPars
1a5d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
1a5e0 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73  LimitB = ++pPars
1a5f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
1a600 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a610 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f  , OP_Copy, p->iO
1a620 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73  ffset ? p->iOffs
1a630 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74  et+1 : p->iLimit
1a640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a660 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a      regLimitA);.
1a670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a680 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
1a690 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67  , regLimitA, reg
1a6a0 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65  LimitB);.  }else
1a6b0 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
1a6c0 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b  = regLimitB = 0;
1a6d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
1a6e0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
1a6f0 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c  pLimit);.  p->pL
1a700 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  imit = 0;..  reg
1a710 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
1a720 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
1a730 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
1a740 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
1a750 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a760 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
1a770 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
1a780 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1a790 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
1a7a0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1a7b0 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
1a7c0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
1a7d0 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
1a7e0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
1a7f0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a800 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1a810 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1a820 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
1a830 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
1a840 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
1a850 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
1a860 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1a870 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
1a880 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1a890 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1a8a0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1a8b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1a8c0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1a8d0 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
1a8e0 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
1a8f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
1a900 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
1a910 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
1a920 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c  egLimitA;.  expl
1a930 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
1a940 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
1a950 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
1a960 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1a970 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
1a980 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
1a990 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1a9a0 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  v, regAddrA);.  
1a9b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1a9c0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
1a9d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1a9e0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
1a9f0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
1aa00 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
1aa10 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
1aa20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
1aa30 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1aa40 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1aa50 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1aa60 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1aa70 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1aa80 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1aa90 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
1aaa0 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
1aab0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1aac0 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
1aad0 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
1aae0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
1aaf0 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
1ab00 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
1ab10 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
1ab20 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1ab30 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
1ab40 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
1ab50 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
1ab60 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
1ab70 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1ab80 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
1ab90 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
1aba0 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
1abb0 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
1abc0 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
1abd0 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1abe0 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
1abf0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1ac00 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1ac10 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1ac20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
1ac30 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1ac40 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1ac50 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1ac60 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
1ac70 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1ac80 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
1ac90 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
1aca0 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
1acb0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
1acc0 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
1ace0 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
1acf0 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
1ad00 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
1ad10 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
1ad20 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
1ad30 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1ad40 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
1ad50 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1ad60 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
1ad70 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
1ad80 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
1ad90 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
1ada0 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
1adb0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1adc0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1add0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1ade0 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
1adf0 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
1ae00 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
1ae10 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1ae20 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
1ae50 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1ae70 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1ae80 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  belEnd);.  }.  s
1ae90 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
1aea0 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20  ef(pKeyDup);..  
1aeb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1aec0 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1aed0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1aee0 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
1aef0 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1af00 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1af10 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
1af20 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1af30 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
1af40 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1af50 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1af60 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41  A_noB = addrEofA
1af70 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d   = labelEnd;.  }
1af80 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1af90 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1afa0 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
1afb0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1afc0 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
1afd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1afe0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1aff0 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72  rOutB);.    addr
1b000 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74  EofA_noB = sqlit
1b010 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b020 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1b030 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  rB, labelEnd);. 
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b060 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b070 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1b080 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
1b090 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
1b0a0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
1b0b0 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
1b0c0 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
1b0d0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
1b0e0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1b0f0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1b100 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1b110 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1b120 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
1b130 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1b140 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1b150 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
1b160 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
1b170 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1b180 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
1b190 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
1b1a0 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
1b1b0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
1b1c0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1b1d0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1b1e0 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
1b1f0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1b200 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
1b210 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1b220 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
1b230 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b240 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1b250 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1b260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b270 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1b280 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62  d, regAddrA, lab
1b290 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  elEnd); VdbeCove
1b2a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1b2b0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b2c0 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
1b2d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b2e0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1b2f0 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
1b300 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1b310 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
1b320 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1b330 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
1b340 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b350 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1b360 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1b370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b380 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b390 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1b3a0 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1b3b0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b3c0 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b3d0 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
1b3e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1b3f0 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1b400 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
1b410 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1b420 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1b430 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
1b440 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1b450 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1b460 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1b470 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
1b480 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
1b490 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1b4a0 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
1b4b0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1b4c0 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
1b4d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b4e0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b4f0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1b500 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b510 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b520 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1b530 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
1b540 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1b550 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1b560 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
1b570 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1b580 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
1b590 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
1b5a0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1b5b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1b5c0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1b5d0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1b5e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1b5f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b600 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1b610 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
1b620 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b630 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b640 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1b650 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1b660 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b670 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b680 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
1b690 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
1b6a0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
1b6b0 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
1b6c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1b6d0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1b6e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b6f0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b700 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1b710 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43  EofA_noB); VdbeC
1b720 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b740 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b750 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1b760 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b770 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
1b780 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
1b790 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
1b7a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1b7b0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
1b7c0 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
1b7d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
1b7e0 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
1b7f0 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
1b800 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
1b810 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
1b820 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1b830 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
1b840 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
1b850 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
1b880 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
1b890 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b8a0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
1b8b0 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73  AG_PERMUTE);.  s
1b8c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b8d0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
1b8e0 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
1b8f0 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65   addrAgtB); Vdbe
1b900 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1b910 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
1b920 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
1b930 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
1b940 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1b950 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b960 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1b970 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65  elEnd);..  /* Re
1b980 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
1b990 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
1b9a0 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
1b9b0 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
1b9c0 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
1b9d0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
1b9e0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1b9f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
1ba00 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
1ba10 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
1ba20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1ba30 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e  or;.  pPrior->pN
1ba40 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a  ext = p;..  /***
1ba50 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75   TBD:  Insert su
1ba60 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74  broutine calls t
1ba70 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  o close cursors 
1ba80 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20  on incomplete.  
1ba90 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  **** subqueries 
1baa0 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43  ****/.  explainC
1bab0 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
1bac0 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
1bad0 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75  Sub2, 0);.  retu
1bae0 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21  rn pParse->nErr!
1baf0 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  =0;.}.#endif..#i
1bb00 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1bb10 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1bb20 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1bb30 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a  ITE_OMIT_VIEW)..
1bb40 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
1bb50 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65  f the SubstConte
1bb60 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  xt object descri
1bb70 62 65 73 20 61 6e 20 73 75 62 73 74 69 74 75 74  bes an substitut
1bb80 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62  ion edit.** to b
1bb90 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61  e performed on a
1bba0 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a   parse tree..**.
1bbb0 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65  ** All reference
1bbc0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
1bbd0 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65  table iTable are
1bbe0 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
1bbf0 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  by corresponding
1bc00 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1bc10 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79  in pEList..*/.ty
1bc20 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75 62  pedef struct Sub
1bc30 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61  stContext {.  Pa
1bc40 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1bc50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1bc60 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1bc70 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20  /.  int iTable; 
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bc90 20 52 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e   Replace referen
1bca0 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ces to this tabl
1bcb0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54  e */.  int iNewT
1bcc0 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
1bcd0 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75   /* New table nu
1bce0 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  mber */.  int is
1bcf0 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20  LeftJoin;       
1bd00 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46      /* Add TK_IF
1bd10 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65  _NULL_ROW opcode
1bd20 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63  s on each replac
1bd30 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ement */.  ExprL
1bd40 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1bd50 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d       /* Replacem
1bd60 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ent expressions 
1bd70 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78  */.} SubstContex
1bd80 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  t;../* Forward D
1bd90 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
1bda0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1bdb0 45 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f  ExprList(SubstCo
1bdc0 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74  ntext*, ExprList
1bdd0 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
1bde0 73 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73  substSelect(Subs
1bdf0 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63  tContext*, Selec
1be00 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  t*, int);../*.**
1be10 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
1be20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1be30 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
1be40 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
1be50 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
1be60 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
1be70 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
1be80 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
1be90 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
1bea0 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
1beb0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1bec0 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
1bed0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
1bee0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1bef0 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
1bf00 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
1bf10 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
1bf20 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
1bf30 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
1bf40 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
1bf50 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
1bf60 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
1bf70 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1bf80 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
1bf90 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
1bfa0 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
1bfb0 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
1bfc0 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
1bfd0 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74   routine makes t
1bfe0 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
1bff0 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
1c000 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
1c010 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
1c020 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
1c030 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
1c040 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
1c050 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1c060 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
1c070 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
1c080 45 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e  Expr(.  SubstCon
1c090 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f  text *pSubst,  /
1c0a0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1c0b0 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f   the substitutio
1c0c0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1c0d0 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
1c0e0 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1c0f0 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1c100 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  rs */.){.  if( p
1c110 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
1c120 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
1c130 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1c140 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
1c150 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68   && pExpr->iRigh
1c160 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62  tJoinTable==pSub
1c170 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a  st->iTable.  ){.
1c180 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68      pExpr->iRigh
1c190 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75  tJoinTable = pSu
1c1a0 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a  bst->iNewTable;.
1c1b0 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
1c1c0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
1c1d0 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
1c1e0 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20  =pSubst->iTable 
1c1f0 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
1c200 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
1c210 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1c220 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
1c230 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
1c240 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
1c250 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73  r *pCopy = pSubs
1c260 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
1c270 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1c280 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69  pr;.      Expr i
1c290 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20  fNullRow;.      
1c2a0 61 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e  assert( pSubst->
1c2b0 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
1c2c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62  pr->iColumn<pSub
1c2d0 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st->pEList->nExp
1c2e0 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
1c2f0 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
1c300 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
1c310 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
1c320 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1c330 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29  sVector(pCopy) )
1c340 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c350 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
1c360 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20  pSubst->pParse, 
1c370 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65  pCopy);.      }e
1c380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1c390 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73  ite3 *db = pSubs
1c3a0 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  t->pParse->db;. 
1c3b0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73         if( pSubs
1c3c0 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26  t->isLeftJoin &&
1c3d0 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43   pCopy->op!=TK_C
1c3e0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1c3f0 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c     memset(&ifNul
1c400 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lRow, 0, sizeof(
1c410 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20  ifNullRow));.   
1c420 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1c430 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c  .op = TK_IF_NULL
1c440 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20  _ROW;.          
1c450 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20  ifNullRow.pLeft 
1c460 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = pCopy;.       
1c470 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61     ifNullRow.iTa
1c480 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1c490 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ewTable;.       
1c4a0 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75     pCopy = &ifNu
1c4b0 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  llRow;.        }
1c4c0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
1c4d0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1c4e0 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20  b, pCopy, 0);.  
1c4f0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
1c500 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74  & pSubst->isLeft
1c510 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Join ){.        
1c520 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1c530 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65  y(pNew, EP_CanBe
1c540 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
1c550 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1c560 77 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  w && ExprHasProp
1c570 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72  erty(pExpr,EP_Fr
1c580 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
1c590 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68       pNew->iRigh
1c5a0 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78  tJoinTable = pEx
1c5b0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1c5c0 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45  ble;.          E
1c5d0 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1c5e0 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  New, EP_FromJoin
1c5f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c600 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c610 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1c620 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
1c630 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
1c640 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1c650 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
1c660 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
1c670 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  W && pExpr->iTab
1c680 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1c690 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  le ){.      pExp
1c6a0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  r->iTable = pSub
1c6b0 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1c6c0 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e     }.    pExpr->
1c6d0 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1c6e0 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1c6f0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78  >pLeft);.    pEx
1c700 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1c710 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1c720 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1c730 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1c740 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1c750 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1c760 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1c770 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1c780 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  x.pSelect, 1);. 
1c790 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c7a0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1c7b0 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  ubst, pExpr->x.p
1c7c0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1c7d0 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1c7e0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1c7f0 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1c800 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1c810 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70  ubst, /* Descrip
1c820 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1c830 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  titution */.  Ex
1c840 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
1c850 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1c860 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1c870 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1c880 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  utes */.){.  int
1c890 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1c8a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1c8b0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1c8c0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1c8d0 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1c8e0 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1c8f0 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61  pSubst, pList->a
1c900 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
1c910 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1c920 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62  bstSelect(.  Sub
1c930 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1c940 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  t, /* Descriptio
1c950 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1c960 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ution */.  Selec
1c970 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1c980 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1c990 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1c9a0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1c9b0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50  ons */.  int doP
1c9c0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rior           /
1c9d0 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1c9e0 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1c9f0 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1ca00 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1ca10 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1ca20 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1ca30 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1ca40 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    sub
1ca50 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1ca60 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  t, p->pEList);. 
1ca70 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1ca80 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f  (pSubst, p->pGro
1ca90 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74  upBy);.    subst
1caa0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1cab0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
1cac0 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1cad0 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1cae0 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  , p->pHaving);. 
1caf0 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1cb00 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1cb10 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
1cb20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1cb30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
1cb40 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  c!=0 );.    for(
1cb50 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1cb60 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1cb70 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1cb80 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1cb90 63 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d  ct(pSubst, pItem
1cba0 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  ->pSelect, 1);. 
1cbb0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1cbc0 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
1cbd0 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70          substExp
1cbe0 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49  rList(pSubst, pI
1cbf0 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1cc00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1cc10 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69  .  }while( doPri
1cc20 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50  or && (p = p->pP
1cc30 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65  rior)!=0 );.}.#e
1cc40 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1cc50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1cc60 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1cc70 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1cc80 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1cc90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1cca0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1ccb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ccc0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1ccd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1cce0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1ccf0 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1cd00 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1cd10 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1cd20 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1cd30 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1cd40 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1cd50 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1cd60 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1cd70 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1cd80 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1cd90 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1cda0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1cdb0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1cdc0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1cdd0 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1cde0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1cdf0 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1ce00 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1ce10 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1ce20 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1ce30 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1ce40 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1ce50 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1ce60 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1ce70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1ce80 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1ce90 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1cea0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1ceb0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1cec0 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1ced0 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1cee0 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1cef0 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1cf00 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1cf10 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1cf20 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1cf30 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1cf40 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1cf50 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1cf60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1cf70 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1cf80 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1cf90 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1cfa0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1cfb0 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1cfc0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1cfd0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1cfe0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1cff0 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1d000 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1d010 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1d020 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1d030 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1d040 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1d050 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1d060 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1d070 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1d080 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1d090 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1d0a0 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1d0b0 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1d0c0 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1d0d0 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1d0e0 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74   is subject to t
1d0f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1d100 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  straints:.**.** 
1d110 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1d120 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1d130 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1d140 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1d150 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  :.**        The 
1d160 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
1d170 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1d180 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72  not both be aggr
1d190 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
1d1a0 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1d1b0 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1d1c0 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1d1d0 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1d1e0 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66  **        (2) If
1d1f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1d200 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
1d210 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61  en.**        (2a
1d220 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1d230 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20  y must not be a 
1d240 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  join and.**     
1d250 20 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65     (2b) the oute
1d260 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1d270 20 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a   use subqueries.
1d280 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
1d290 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1d2a0 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  e FROM-clause su
1d2b0 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1d2c0 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20   candidate.**   
1d2d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c            for fl
1d2e0 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73  attening.  (This
1d2f0 20 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65   is due to ticke
1d300 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61  t [2f7170d73bf9a
1d310 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20  bf80].**        
1d320 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30       from 2015-0
1d330 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1d340 33 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3)  If the subqu
1d350 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1d360 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1d370 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20  FT JOIN then.** 
1d380 20 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20         (3a) the 
1d390 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1d3a0 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1d3b0 2a 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68  *        (3b) th
1d3c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1d3d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1d3e0 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  y not contain a 
1d3f0 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20  virtual.**      
1d400 20 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64         table and
1d410 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20  .**        (3c) 
1d420 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d430 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  may not be an ag
1d440 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20  gregate..**.**  
1d450 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1d460 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49  ry can not be DI
1d470 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
1d480 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
1d490 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
1d4a0 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
1d4b0 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
1d4c0 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
1d4d0 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
1d4e0 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
1d4f0 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
1d500 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
1d510 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
1d520 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
1d530 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
1d540 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
1d550 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
1d560 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1d570 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1d580 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1d590 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1d5a0 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  s.  Was:.**     
1d5b0 20 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65     If the subque
1d5c0 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c  ry is aggregate,
1d5d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d5e0 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54   may not be DIST
1d5f0 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
1d600 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1d610 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
1d620 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1d630 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1d640 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1d650 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1d660 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1d670 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77   a FROM clause w
1d680 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1d690 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1d6a0 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1d6b0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1d6c0 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1d6d0 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1d6e0 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1d6f0 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68  .**   (8)  If th
1d700 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1d710 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1d720 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1d730 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  ot be a join..**
1d740 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68  .**   (9)  If th
1d750 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1d760 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1d770 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1d780 6f 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e  ot be aggregate.
1d790 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1d7a0 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1d7b0 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1d7c0 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1d7d0 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1d7e0 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1d7f0 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1d800 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1d810 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1d820 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1d830 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a       constraint:
1d840 20 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72   "If the subquer
1d850 79 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74  y is aggregate t
1d860 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
1d870 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d  ery .**        m
1d880 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1d890 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1d8a0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1d8b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d8c0 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61   may not both ha
1d8d0 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1d8e0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1d8f0 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1d900 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1d910 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1d920 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1d930 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1d940 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1d950 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1d960 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1d970 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1d980 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1d990 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1d9a0 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
1d9b0 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
1d9c0 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1d9d0 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1d9e0 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74  *.**  (15)  If t
1d9f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1da00 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  s part of a comp
1da10 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1da20 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
1da30 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1da40 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20   use LIMIT..**  
1da50 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
1da60 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
1da70 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
1da80 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49  ..**.**  (16)  I
1da90 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1daa0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1dab0 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
1dac0 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
1dad0 20 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59      use ORDER BY
1dae0 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
1daf0 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
1db00 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
1db10 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
1db20 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
1db30 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
1db40 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
1db50 31 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71  17)  If the subq
1db60 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1db70 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a  nd select, then.
1db80 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20  **        (17a) 
1db90 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  all compound ope
1dba0 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61  rators must be a
1dbb0 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a   UNION ALL, and.
1dbc0 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20  **        (17b) 
1dbd0 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20  no terms within 
1dbe0 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
1dbf0 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67  pound may be agg
1dc00 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  regate.**       
1dc10 20 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e         or DISTIN
1dc20 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  CT, and.**      
1dc30 20 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65    (17c) every te
1dc40 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75  rm within the su
1dc50 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20  bquery compound 
1dc60 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
1dc70 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
1dc80 20 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65    (17d) the oute
1dc90 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1dca0 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
1dcb0 20 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67     (17d1) aggreg
1dcc0 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  ate, or.**      
1dcd0 20 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44          (17d2) D
1dce0 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20  ISTINCT, or.**  
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64              (17d
1dd00 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  3) a join..**.**
1dd10 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
1dd20 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
1dd30 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
1dd40 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
1dd50 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
1dd60 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
1dd70 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
1dd80 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
1dd90 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
1dda0 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
1ddb0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1ddc0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1ddd0 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
1dde0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1ddf0 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
1de00 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
1de10 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
1de20 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
1de30 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
1de40 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
1de50 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
1de60 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
1de70 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
1de80 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
1de90 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
1dea0 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
1deb0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
1dec0 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
1ded0 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
1dee0 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
1def0 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
1df00 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
1df10 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
1df20 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1df30 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
1df40 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
1df50 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
1df60 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
1df70 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
1df80 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
1df90 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
1dfa0 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
1dfb0 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
1dfc0 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
1dfd0 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
1dfe0 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
1dff0 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
1e000 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1e010 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1e020 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
1e030 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
1e040 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
1e050 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  BY clause of the
1e060 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
1e070 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
1e080 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
1e090 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
1e0a0 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
1e0b0 20 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75   (19)  If the su
1e0c0 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49  bquery uses LIMI
1e0d0 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  T then the outer
1e0e0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a   query may not.*
1e0f0 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
1e100 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
1e110 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
1e120 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1e130 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1e140 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
1e150 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
1e160 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1e170 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
1e180 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
1e190 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
1e1a0 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
1e1b0 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
1e1c0 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
1e1d0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1e1e0 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
1e1f0 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
1e200 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
1e210 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1e220 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1e230 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1e240 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
1e250 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
1e260 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
1e270 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
1e280 28 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62  (21)  If the sub
1e290 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1e2a0 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1e2b0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1e2c0 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
1e2d0 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65  NCT.  (See ticke
1e2e0 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e  t [752e1646fc]).
1e2f0 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68  .**.**  (22)  Th
1e300 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1e310 6f 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76  ot be a recursiv
1e320 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  e CTE..**.**  (*
1e330 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  *)  Subsumed int
1e340 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  o restriction (1
1e350 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74  7d3).  Was: If t
1e360 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1e370 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65  s.**        a re
1e380 63 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65  cursive CTE, the
1e390 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  n the sub-query 
1e3a0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
1e3b0 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20  pound query..** 
1e3c0 20 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74         This rest
1e3d0 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75  riction is becau
1e3e0 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  se transforming 
1e3f0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61  the.**        pa
1e400 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75  rent to a compou
1e410 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65  nd query confuse
1e420 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  s the code that 
1e430 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20  handles.**      
1e440 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72    recursive quer
1e450 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65  ies in multiSele
1e460 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ct()..**.**  (**
1e470 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
1e480 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
1e490 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
1e4a0 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
1e4b0 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62  *        The sub
1e4c0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1e4d0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
1e4e0 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c  at uses the buil
1e4f0 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a  t-in min() or .*
1e500 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28  *        or max(
1e510 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57  ) functions.  (W
1e520 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74  ithout this rest
1e530 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79  riction, a query
1e540 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20   like:.**       
1e550 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   "SELECT x FROM 
1e560 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20  (SELECT max(y), 
1e570 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c  x FROM t1)" woul
1e580 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  d not necessaril
1e590 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75  y.**        retu
1e5a0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66  rn the value X f
1e5b0 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d  or which Y was m
1e5c0 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a  aximal.).**.**.*
1e5d0 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
1e5e0 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
1e5f0 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
1e600 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
1e610 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
1e620 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
1e630 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
1e640 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
1e650 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
1e660 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
1e670 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
1e680 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
1e690 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
1e6a0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
1e6b0 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
1e6c0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
1e6d0 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
1e6e0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1e6f0 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
1e700 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1e710 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
1e720 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
1e730 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
1e740 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
1e750 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
1e760 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
1e770 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
1e780 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
1e790 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1e7a0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1e7b0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1e7c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
1e7d0 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
1e7e0 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
1e7f0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1e800 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
1e810 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
1e820 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
1e830 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
1e840 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20  /.  int isAgg   
1e850 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e860 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
1e870 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
1e880 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
1e890 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1e8a0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
1e8b0 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
1e8c0 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
1e8d0 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a   *pParent;    /*
1e8e0 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41   Current UNION A
1e8f0 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f  LL term of the o
1e900 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  ther query */.  
1e910 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
1e920 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
1e930 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
1e940 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
1e950 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
1e960 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
1e970 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
1e980 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
1e990 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1e9a0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
1e9b0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1e9c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1e9d0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
1e9e0 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
1e9f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1ea00 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
1ea10 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
1ea20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
1ea30 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
1ea40 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
1ea50 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
1ea60 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20  nt iNewParent = 
1ea70 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e  -1;/* Replacemen
1ea80 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72  t table for iPar
1ea90 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ent */.  int isL
1eaa0 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20  eftJoin = 0; /* 
1eab0 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20  True if pSub is 
1eac0 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
1ead0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f  f a LEFT JOIN */
1eae0 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20      .  int i;   
1eaf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1eb00 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1eb10 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1eb40 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1eb50 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1eb60 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
1eb70 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1eb80 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1eb90 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
1eba0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1ebb0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1ebc0 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
1ebd0 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
1ebe0 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
1ebf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1ec00 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66  Prior==0 );.  if
1ec10 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
1ec20 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
1ec30 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
1ec40 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1ec50 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1ec60 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
1ec70 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
1ec80 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
1ec90 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
1eca0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
1ecb0 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
1ecc0 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
1ecd0 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
1ece0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
1ecf0 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
1ed00 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
1ed10 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
1ed20 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
1ed30 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
1ed40 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
1ed50 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1ed60 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
1ed70 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
1ed80 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
1ed90 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
1eda0 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
1edb0 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
1edc0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
1edd0 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
1ede0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
1edf0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
1ee00 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
1ee10 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
1ee20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
1ee30 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
1ee40 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
1ee50 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
1ee60 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
1ee70 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
1ee80 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
1ee90 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
1eea0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1eeb0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1eec0 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
1eed0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53  ub->pLimit && pS
1eee0 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67  ub->pLimit->pRig
1eef0 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ht ) return 0;  
1ef00 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1ef10 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70  (14) */.  if( (p
1ef20 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1ef30 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20  Compound)!=0 && 
1ef40 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
1ef50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ef90 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
1efa0 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
1efb0 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
1efc0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1efe0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
1eff0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1f000 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1f010 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
1f020 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1f030 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20  Restriction (4) 
1f040 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1f050 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d  pLimit && (pSrc-
1f060 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
1f070 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
1f080 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1f090 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28  estrictions (8)(
1f0a0 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  9) */.  }.  if( 
1f0b0 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
1f0c0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1f0d0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1f110 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
1f120 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
1f130 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1f140 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f160 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
1f170 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1f180 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
1f190 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1b0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
1f1c0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1f1d0 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
1f1e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1f1f0 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
1f200 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1f210 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f220 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
1f230 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1f240 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
1f250 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ive) ){.    retu
1f260 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
1f270 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20  tions (22) */.  
1f280 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
1f290 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f2a0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1f2b0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
1f2c0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
1f2d0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1f2e0 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c   be a join itsel
1f2f0 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20  f (3a). Example 
1f300 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1f310 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a  ot.  ** allowed:
1f320 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1f330 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
1f340 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
1f350 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
1f360 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
1f370 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
1f380 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
1f390 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
1f3a0 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
1f3b0 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
1f3c0 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
1f3d0 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
1f3e0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  g..  **.  ** If 
1f3f0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f400 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1f410 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
1f420 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  , then the outer
1f430 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e  .  ** query cann
1f440 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
1f450 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69  te. (3c)  This i
1f460 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66  s an artifact of
1f470 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67   the way.  ** ag
1f480 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f  gregates are pro
1f490 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69  cessed - there i
1f4a0 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74  s no mechanism t
1f4b0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20  o determine if. 
1f4c0 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   ** the LEFT JOI
1f4d0 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  N table should b
1f4e0 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a  e all-NULL..  **
1f4f0 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  .  ** See also t
1f500 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35  ickets #306, #35
1f510 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20  0, and #3300..  
1f520 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74  */.  if( (pSubit
1f530 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
1f540 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
1f550 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e  {.    isLeftJoin
1f560 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53   = 1;.    if( pS
1f570 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  ubSrc->nSrc>1 ||
1f580 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74   isAgg || IsVirt
1f590 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30  ual(pSubSrc->a[0
1f5a0 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ].pTab) ){.     
1f5b0 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20   /*  (3a)       
1f5c0 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28        (3c)     (
1f5d0 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  3b) */.      ret
1f5e0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
1f5f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f600 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20  XTRA_IFNULLROW. 
1f610 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e   else if( iFrom>
1f620 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20  0 && !isAgg ){. 
1f630 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73     /* Setting is
1f640 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63  LeftJoin to -1 c
1f650 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52  auses OP_IfNullR
1f660 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  ow opcodes to be
1f670 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20   generated for. 
1f680 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65     ** every refe
1f690 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73  rence to any res
1f6a0 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  ult column from 
1f6b0 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f  subquery in a jo
1f6c0 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20  in, even.    ** 
1f6d0 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20  though they are 
1f6e0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
1f6f0 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73  This will stress
1f700 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e  -test the OP_IfN
1f710 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f  ullRow .    ** o
1f720 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73  pcode. */.    is
1f730 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20  LeftJoin = -1;. 
1f740 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1f750 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29  Restriction (17)
1f760 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1f770 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1f780 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1f790 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1f7a0 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1f7b0 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1f7c0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1f7d0 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1f7e0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1f7f0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1f800 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1f810 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1f820 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1f830 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1f840 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1f850 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1f860 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1f870 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f880 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1f890 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d  on (20) */.    }
1f8a0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
1f8b0 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1f8c0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1f8d0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
1f8e0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
1f8f0 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20  n 0; /* (17d1), 
1f900 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33  (17d2), or (17d3
1f910 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) */.    }.    f
1f920 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
1f930 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
1f940 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
1f950 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1f960 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1f970 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1f980 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
1f990 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
1f9a0 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1f9b0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1f9c0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1f9d0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
1f9e0 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
1f9f0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1fa00 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
1fa10 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
1fa20 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
1fa30 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
1fa40 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
1fa50 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1fa60 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1fa70 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
1fa80 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a      /* (17b) */.
1fa90 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
1faa0 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
1fab0 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20  1->op!=TK_ALL)  
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fad0 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20  * (17a) */.     
1fae0 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
1faf0 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20  ->nSrc<1        
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37            /* (17
1fb20 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20  c) */.      ){. 
1fb30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1fb40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1fb50 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1fb60 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1fb70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1fb80 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20  striction (18). 
1fb90 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
1fba0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1fbb0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
1fbc0 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
1fbd0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
1fbe0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1fbf0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
1fc00 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
1fc10 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
1fc20 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1fc30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72  }.  }..  /* Ex-r
1fc40 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 3a  estriction (23):
1fc50 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77  .  ** The only w
1fc60 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63 75  ay that the recu
1fc70 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20  rsive part of a 
1fc80 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20  CTE can contain 
1fc90 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20  a compound.  ** 
1fca0 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72 20  subquery is for 
1fcb0 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
1fcc0 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61  be one term of a
1fcd0 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74   join.  But if t
1fce0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1fcf0 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e   is a join, then
1fd00 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
1fd10 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1fd20 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a   stopped by.  **
1fd30 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
1fd40 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  d3).  */.  asser
1fd50 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
1fd60 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
1fd70 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69  =0 || pSub->pPri
1fd80 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a  or==0 );..  /***
1fd90 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
1fda0 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
1fdb0 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
1fdc0 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c  ed. *****/.  SEL
1fdd0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
1fde0 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73  e,p,("flatten %s
1fdf0 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64  .%p from term %d
1fe00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1fe10 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53          pSub->zS
1fe20 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46  elName, pSub, iF
1fe30 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74  rom));..  /* Aut
1fe40 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75  horize the subqu
1fe50 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  ery */.  pParse-
1fe60 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1fe70 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  pSubitem->zName;
1fe80 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29  .  TESTONLY(i =)
1fe90 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1fea0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1feb0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
1fec0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  );.  testcase( i
1fed0 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b  ==SQLITE_DENY );
1fee0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1fef0 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
1ff00 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  AuthContext;..  
1ff10 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  /* If the sub-qu
1ff20 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1ff30 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
1ff40 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73  nt, then (by res
1ff50 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31  trictions.  ** 1
1ff60 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20  7 and 18 above) 
1ff70 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49  it must be a UNI
1ff80 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70  ON ALL and the p
1ff90 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74  arent query must
1ffa0 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65   .  ** be of the
1ffb0 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
1ffc0 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70       SELECT <exp
1ffd0 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73  r-list> FROM (<s
1ffe0 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72  ub-query>) <wher
1fff0 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a  e-clause> .  **.
20000 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79    ** followed by
20010 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
20020 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53  IMIT and/or OFFS
20030 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73  ET clauses. This
20040 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61   block.  ** crea
20050 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f  tes N-1 copies o
20060 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  f the parent que
20070 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f  ry without any O
20080 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f  RDER BY, LIMIT o
20090 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63  r .  ** OFFSET c
200a0 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73  lauses and joins
200b0 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66   them to the lef
200c0 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74  t-hand-side of t
200d0 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
200e0 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c   using UNION ALL
200f0 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74   operators. In t
20100 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68  his case N is th
20110 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70  e number of simp
20120 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73  le.  ** select s
20130 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
20140 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
20150 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ery..  **.  ** E
20160 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
20170 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31  *     SELECT a+1
20180 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20   FROM (.  **    
20190 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
201a0 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
201b0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
201c0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79          SELECT y
201d0 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
201e0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
201f0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
20200 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d  CT abs(z*2) FROM
20210 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29   tab2.  **     )
20220 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45   WHERE a!=5 ORDE
20230 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
20240 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
20250 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
20260 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d   SELECT x+1 FROM
20270 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d   tab WHERE x+1!=
20280 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
20290 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
202a0 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61  LECT y+1 FROM ta
202b0 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20  b WHERE y+1!=5. 
202c0 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
202d0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
202e0 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f  T abs(z*2)+1 FRO
202f0 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73  M tab2 WHERE abs
20300 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20  (z*2)+1!=5.  ** 
20310 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20      ORDER BY 1. 
20320 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c   **.  ** We call
20330 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f   this the "compo
20340 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
20350 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20  ttening"..  */. 
20360 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e   for(pSub=pSub->
20370 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53  pPrior; pSub; pS
20380 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
20390 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
203a0 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ew;.    ExprList
203b0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
203c0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78  pOrderBy;.    Ex
203d0 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
203e0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65  pLimit;.    Sele
203f0 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
20400 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
20410 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
20420 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20   p->pSrc = 0;.  
20430 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
20440 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
20450 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
20460 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
20470 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73  db, p, 0);.    s
20480 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
20490 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e  ame(pNew, pSub->
204a0 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70  zSelName);.    p
204b0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
204c0 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
204d0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
204e0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
204f0 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
20500 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70  K_ALL;.    if( p
20510 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
20520 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
20530 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
20540 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
20550 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
20560 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
20570 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
20580 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  New;.      pNew-
20590 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
205a0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
205b0 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ew;.      SELECT
205c0 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70  TRACE(2,pParse,p
205d0 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d  ,.         ("com
205e0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
205f0 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73  lattener creates
20600 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e   %s.%p as peer\n
20610 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77  ",.         pNew
20620 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77  ->zSelName, pNew
20630 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
20640 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
20650 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
20660 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
20670 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
20680 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
20690 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
206a0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
206b0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
206c0 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
206d0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
206e0 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
206f0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
20700 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
20710 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
20720 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
20730 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
20740 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
20750 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
20760 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20770 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
20780 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
20790 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
207a0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
207b0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
207c0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
207d0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
207e0 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
207f0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
20800 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
20810 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
20820 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
20830 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
20840 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
20850 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
20860 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
20870 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
20880 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
20890 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
208a0 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
208b0 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
208c0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
208d0 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
208e0 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
208f0 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
20900 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
20910 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
20920 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
20930 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
20940 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
20950 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
20960 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
20970 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
20980 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
20990 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
209a0 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d  ToDel->nTabRef==
209b0 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
209c0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
209d0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
209e0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
209f0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
20a00 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
20a10 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
20a20 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
20a30 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
20a40 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
20a50 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
20a60 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d  ToDel->nTabRef--
20a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
20a80 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
20a90 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
20aa0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
20ab0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
20ac0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
20ad0 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
20ae0 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
20af0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
20b00 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
20b10 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
20b20 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
20b30 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
20b40 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
20b50 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
20b60 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
20b70 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
20b80 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
20b90 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
20ba0 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
20bb0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
20bc0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
20bd0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
20be0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
20bf0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
20c00 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
20c10 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
20c20 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
20c30 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
20c40 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
20c50 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
20c60 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
20c70 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
20c80 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
20c90 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
20ca0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
20cb0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
20cc0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
20cd0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
20ce0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
20cf0 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
20d00 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
20d10 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
20d20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
20d30 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
20d40 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
20d50 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
20d60 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
20d70 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
20d80 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
20d90 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
20da0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
20db0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
20dc0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
20dd0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
20de0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
20df0 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
20e00 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
20e10 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
20e20 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
20e30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
20e40 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
20e50 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
20e60 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
20e70 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
20e80 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
20e90 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20ea0 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
20eb0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
20ec0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
20ed0 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
20ee0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
20ef0 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
20f00 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66  pe = pSubitem->f
20f10 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
20f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
20f30 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
20f40 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
20f50 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
20f60 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
20f70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
20f80 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
20f90 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
20fa0 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
20fb0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
20fc0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
20fd0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
20fe0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
20ff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21000 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
21010 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
21020 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
21030 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
21040 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
21050 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
21060 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
21070 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
21080 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
21090 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
210a0 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
210b0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
210c0 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
210d0 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
210e0 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
210f0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
21100 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
21110 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
21120 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
21130 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
21140 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
21150 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
21160 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
21170 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
21180 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
21190 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
211a0 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
211b0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
211c0 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
211d0 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
211e0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
211f0 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
21200 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
21210 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
21220 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63  ter query FROM c
21230 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73  lause to 4 slots
21240 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64  ..    ** The mid
21250 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61  dle slot is expa
21260 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
21270 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
21280 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20  ke space.    ** 
21290 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d  for the two elem
212a0 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
212b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
212c0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
212d0 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
212e0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
212f0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
21300 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
21310 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
21320 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
21330 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
21340 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
21350 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
21360 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
21370 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
21380 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
21390 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
213a0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
213b0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
213c0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
213d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
213e0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
213f0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
21400 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
21410 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
21420 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
21430 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
21440 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
21450 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
21460 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
21470 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
21480 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d      iNewParent =
21490 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69   pSubSrc->a[i].i
214a0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65  Cursor;.      me
214b0 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
214c0 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
214d0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
214e0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
214f0 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e  a[iFrom].fg.join
21500 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
21510 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
21520 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
21530 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
21540 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
21550 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
21560 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
21570 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
21580 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
21590 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
215a0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
215b0 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
215c0 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
215d0 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
215e0 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
215f0 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
21600 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
21610 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
21620 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
21630 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
21640 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
21650 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
21660 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
21670 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
21680 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21690 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
216a0 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
216b0 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
216c0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
216d0 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
216e0 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
216f0 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
21700 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
21710 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
21720 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
21730 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
21740 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
21750 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
21760 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
21770 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
21780 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
21790 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
217a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
217b0 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
217c0 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
217d0 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
217e0 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
217f0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
21800 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
21810 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
21820 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
21830 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
21840 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
21850 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
21860 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
21870 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
21880 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
21890 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
218a0 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
218b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
218c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
218d0 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
218e0 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
218f0 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
21900 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
21910 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
21920 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
21930 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
21940 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
21950 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
21960 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
21970 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
21980 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
21990 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
219a0 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
219b0 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
219c0 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
219d0 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
219e0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
219f0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
21a00 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
21a10 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
21a20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
21a30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
21a40 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
21a50 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
21a60 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
21a70 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
21a80 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
21a90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21aa0 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
21ab0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21ac0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
21ad0 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
21ae0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
21af0 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65      }.    pWhere
21b00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
21b10 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
21b20 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  re, 0);.    if( 
21b30 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a  isLeftJoin>0 ){.
21b40 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
21b50 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61  r(pWhere, iNewPa
21b60 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rent);.    }.   
21b70 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
21b80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
21b90 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50  d(db, pWhere, pP
21ba0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a  arent->pWhere);.
21bb0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
21bc0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
21bd0 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78       SubstContex
21be0 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61  t x;.      x.pPa
21bf0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
21c00 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
21c10 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e  Parent;.      x.
21c20 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77  iNewTable = iNew
21c30 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e  Parent;.      x.
21c40 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c  isLeftJoin = isL
21c50 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78  eftJoin;.      x
21c60 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e  .pEList = pSub->
21c70 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75  pEList;.      su
21c80 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50  bstSelect(&x, pP
21c90 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d  arent, 0);.    }
21ca0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
21cb0 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
21cc0 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
21cd0 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
21ce0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
21cf0 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
21d00 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
21d10 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
21d20 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
21d30 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
21d40 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
21d50 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
21d60 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
21d70 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
21d80 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
21d90 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
21da0 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
21db0 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
21dc0 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
21dd0 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
21de0 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
21df0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
21e00 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
21e10 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
21e20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
21e30 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
21e40 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
21e50 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
21e60 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
21e70 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
21e80 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
21e90 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
21ea0 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
21eb0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
21ec0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
21ed0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
21ee0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
21ef0 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45  Sub1);..#if SELE
21f00 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
21f10 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
21f20 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
21f30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
21f40 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
21f50 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74  ,p,("After flatt
21f60 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20  ening:\n"));.   
21f70 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
21f80 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
21f90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
21fa0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
21fb0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
21fc0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
21fd0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
21fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
21ff0 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  ) */....#if !def
22000 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
22010 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
22020 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
22030 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d  IT_VIEW)./*.** M
22040 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65  ake copies of re
22050 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61  levant WHERE cla
22060 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
22070 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74   outer query int
22080 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  o.** the WHERE c
22090 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
220a0 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  y.  Example:.**.
220b0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
220c0 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
220d0 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
220e0 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20  M t1) WHERE x=5 
220f0 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
22100 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
22110 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
22120 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
22130 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
22140 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
22150 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a  a=5 AND c-d=10).
22160 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35  **     WHERE x=5
22170 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
22180 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61   The hope is tha
22190 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65  t the terms adde
221a0 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71  d to the inner q
221b0 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69  uery will make i
221c0 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69  t more.** effici
221d0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  ent..**.** Do no
221e0 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f  t attempt this o
221f0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a  ptimization if:.
22200 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20  **.**   (1) (** 
22210 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
22220 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20   was removed on 
22230 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20  2017-09-29.  We 
22240 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20  used to.**      
22250 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68       disallow th
22260 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
22270 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73 75  for aggregate su
22280 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f  bqueries, but no
22290 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69  w.**           i
222a0 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20  t is allowed by 
222b0 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74 72  putting the extr
222c0 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48  a terms on the H
222d0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  AVING clause..**
222e0 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 61             The a
222f0 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75  dded HAVING clau
22300 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20  se is pointless 
22310 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
22320 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20  lacks.**        
22330 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c     a GROUP BY cl
22340 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68 20  ause.  But such 
22350 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
22360 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73  is also harmless
22370 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f  .**           so
22380 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20   there does not 
22390 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79  appear to be any
223a0 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65   reason to add e
223b0 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20  xtra logic.**   
223c0 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70 72          to suppr
223d0 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a  ess it. **).**.*
223e0 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65  *   (2) The inne
223f0 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
22400 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66  ecursive part of
22410 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20   a common table 
22420 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
22430 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65  *   (3) The inne
22440 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49  r query has a LI
22450 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63  MIT clause (sinc
22460 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  e the changes to
22470 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20   the WHERE.**   
22480 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20      close would 
22490 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69  change the meani
224a0 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29  ng of the LIMIT)
224b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68  ..**.**   (4) Th
224c0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
224d0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
224e0 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
224f0 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c 65 72 0a  N.  (The caller.
22500 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f 72 63 65  **       enforce
22510 73 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  s this restricti
22520 6f 6e 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  on since this ro
22530 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68  utine does not h
22540 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20  ave enough.**   
22550 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20      information 
22560 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20  to know.).**.** 
22570 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45 20    (5) The WHERE 
22580 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
22590 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20  n originates in 
225a0 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
225b0 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
225c0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
225d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  **.** Return 0 i
225e0 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  f no changes are
225f0 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65   made and non-ze
22600 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ro if one or mor
22610 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
22620 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c  * terms are dupl
22630 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20  icated into the 
22640 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
22650 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e  tic int pushDown
22660 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61  WhereTerms(.  Pa
22670 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
22680 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
22690 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63  text (for malloc
226a0 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70  () and error rep
226b0 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c  orting) */.  Sel
226c0 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20  ect *pSubq,     
226d0 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
226e0 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63  ry whose WHERE c
226f0 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61  lause is to be a
22700 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78  ugmented */.  Ex
22710 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
22720 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
22730 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
22740 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
22750 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20 20  int iCursor     
22760 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
22770 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75  number of the su
22780 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45  bquery */.){.  E
22790 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
227a0 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66   nChng = 0;.  if
227b0 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65  ( pWhere==0 ) re
227c0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53  turn 0;.  if( pS
227d0 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ubq->selFlags & 
227e0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 20 72  SF_Recursive ) r
227f0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73  eturn 0;  /* res
22800 74 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a  triction (2) */.
22810 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
22820 45 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74  EBUG.  /* Only t
22830 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
22840 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20   a compound can 
22850 68 61 76 65 20 61 20 57 49 54 48 20 63 6c 61 75  have a WITH clau
22860 73 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20 20  se.  But make.  
22870 2a 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72  ** sure no other
22880 20 74 65 72 6d 73 20 61 72 65 20 6d 61 72 6b 65   terms are marke
22890 64 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 69  d SF_Recursive i
228a0 6e 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e 67  n case something
228b0 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e   changes.  ** in
228c0 20 74 68 65 20 66 75 74 75 72 65 2e 0a 20 20 2a   the future..  *
228d0 2f 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65 63 74  /.  {.    Select
228e0 20 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f 72 28   *pX;  .    for(
228f0 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58  pX=pSubq; pX; pX
22900 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  =pX->pPrior){.  
22910 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
22920 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
22930 52 65 63 75 72 73 69 76 65 29 29 3d 3d 30 20 29  Recursive))==0 )
22940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
22950 69 66 0a 0a 20 20 69 66 28 20 70 53 75 62 71 2d  if..  if( pSubq-
22960 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20  >pLimit!=0 ){.  
22970 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
22980 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a  estriction (3) *
22990 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
229a0 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
229b0 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b  D ){.    nChng +
229c0 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  = pushDownWhereT
229d0 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75  erms(pParse, pSu
229e0 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67  bq, pWhere->pRig
229f0 68 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht, iCursor);.  
22a00 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72    pWhere = pWher
22a10 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  e->pLeft;.  }.  
22a20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
22a30 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72  rty(pWhere,EP_Fr
22a40 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
22a50 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
22a60 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 69 66 28 20  on (5) */.  if( 
22a70 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
22a80 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72  leConstant(pWher
22a90 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20  e, iCursor) ){. 
22aa0 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20     nChng++;.    
22ab0 77 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a  while( pSubq ){.
22ac0 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65        SubstConte
22ad0 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77  xt x;.      pNew
22ae0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
22af0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57  p(pParse->db, pW
22b00 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  here, 0);.      
22b10 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  x.pParse = pPars
22b20 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c  e;.      x.iTabl
22b30 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
22b40 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d     x.iNewTable =
22b50 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   iCursor;.      
22b60 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30  x.isLeftJoin = 0
22b70 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74  ;.      x.pEList
22b80 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74   = pSubq->pEList
22b90 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
22ba0 75 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65  ubstExpr(&x, pNe
22bb0 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  w);.      if( pS
22bc0 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ubq->selFlags & 
22bd0 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a  SF_Aggregate ){.
22be0 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70          pSubq->p
22bf0 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
22c00 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
22c10 64 62 2c 20 70 53 75 62 71 2d 3e 70 48 61 76 69  db, pSubq->pHavi
22c20 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  ng, pNew);.     
22c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22c40 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20  pSubq->pWhere = 
22c50 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
22c60 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71  Parse->db, pSubq
22c70 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b  ->pWhere, pNew);
22c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
22c90 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50  Subq = pSubq->pP
22ca0 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rior;.    }.  }.
22cb0 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a    return nChng;.
22cc0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
22cd0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
22ce0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
22cf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
22d00 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
22d10 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73 20  ** The pFunc is 
22d20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67 61  the only aggrega
22d30 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  te function in t
22d40 68 65 20 71 75 65 72 79 2e 20 20 43 68 65 63 6b  he query.  Check
22d50 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74 68   to see.** if th
22d60 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61 6e  e query is a can
22d70 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d  didate for the m
22d80 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74  in/max optimizat
22d90 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
22da0 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61  he query is a ca
22db0 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
22dc0 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
22dd0 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a 2a  tion, then set.*
22de0 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20 62  * *ppMinMax to b
22df0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
22e00 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64 20  ause to be used 
22e10 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  for the optimiza
22e20 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74 75  tion.** and retu
22e30 72 6e 20 65 69 74 68 65 72 20 57 48 45 52 45 5f  rn either WHERE_
22e40 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
22e50 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
22e60 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a   depending on.**
22e70 20 77 68 65 74 68 65 72 20 70 46 75 6e 63 20 69   whether pFunc i
22e80 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  s a min() or max
22e90 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
22ea0 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
22eb0 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64 61  is not a candida
22ec0 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
22ed0 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
22ee0 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52 45   return.** WHERE
22ef0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20  _ORDERBY_NORMAL 
22f00 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 7a  (which must be z
22f10 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ero)..**.** This
22f20 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
22f30 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 67   called after ag
22f40 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
22f50 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6c  s have been.** l
22f60 6f 63 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  ocated but befor
22f70 65 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  e their argument
22f80 73 20 68 61 76 65 20 62 65 65 6e 20 73 75 62 6a  s have been subj
22f90 65 63 74 65 64 20 74 6f 20 61 67 67 72 65 67 61  ected to aggrega
22fa0 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e 0a  te.** analysis..
22fb0 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
22fc0 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74 65 33  MaxQuery(sqlite3
22fd0 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75 6e   *db, Expr *pFun
22fe0 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  c, ExprList **pp
22ff0 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65  MinMax){.  int e
23000 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
23010 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20  RBY_NORMAL;     
23020 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
23030 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
23040 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d 3e  pEList = pFunc->
23050 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 41  x.pList;    /* A
23060 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20  rguments to agg 
23070 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  function */.  co
23080 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b  nst char *zFunc;
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
230b0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
230c0 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78 70  n pFunc */.  Exp
230d0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
230e0 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72 3b  .  u8 sortOrder;
230f0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
23100 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61 73  inMax==0 );.  as
23110 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70 3d  sert( pFunc->op=
23120 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
23130 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
23140 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
23150 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
23160 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e 63 20 3d   eRet;.  zFunc =
23170 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e   pFunc->u.zToken
23180 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
23190 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
231a0 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  in")==0 ){.    e
231b0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
231c0 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f 72  RBY_MIN;.    sor
231d0 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f  tOrder = SQLITE_
231e0 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65 20  SO_ASC;.  }else 
231f0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
23200 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
23210 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20  ==0 ){.    eRet 
23220 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
23230 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64  MAX;.    sortOrd
23240 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44  er = SQLITE_SO_D
23250 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ESC;.  }else{.  
23260 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20    return eRet;. 
23270 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d   }.  *ppMinMax =
23280 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
23290 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
232a0 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
232b0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
232c0 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  y!=0 || db->mall
232d0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
232e0 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72  ( pOrderBy ) pOr
232f0 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74  derBy->a[0].sort
23300 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64 65  Order = sortOrde
23310 72 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74  r;.  return eRet
23320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
23330 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
23340 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
23350 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
23360 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
23370 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
23380 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
23390 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
233a0 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
233b0 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
233c0 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
233d0 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
233e0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
233f0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
23400 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
23410 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
23420 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
23430 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
23440 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
23450 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
23460 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
23470 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
23480 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
23490 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
234a0 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
234b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
234c0 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
234d0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
234e0 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
234f0 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
23500 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
23510 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
23520 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
23530 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
23540 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
23550 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
23560 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
23570 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
23580 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
23590 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
235a0 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
235b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
235c0 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
235d0 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
235e0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
235f0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
23600 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
23610 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
23620 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
23630 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
23640 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
23650 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
23660 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
23670 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e  eturn 0;.  if( N
23680 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e  EVER(pAggInfo->n
23690 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72  Func==0) ) retur
236a0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
236b0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
236c0 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26  Func->funcFlags&
236d0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
236e0 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
236f0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
23700 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
23710 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
23720 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
23730 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
23740 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
23750 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
23760 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
23770 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
23780 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
23790 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
237a0 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
237b0 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
237c0 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
237d0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
237e0 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
237f0 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
23800 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
23810 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
23820 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
23830 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
23840 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
23850 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
23860 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
23870 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
23880 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
23890 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
238a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
238b0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
238c0 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
238d0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
238e0 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
238f0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
23900 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
23910 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d  ndexedBy = pFrom
23920 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b  ->u1.zIndexedBy;
23930 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
23940 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
23950 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
23960 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
23970 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
23980 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
23990 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20  edBy); .        
239a0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
239b0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
239c0 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
239d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
239e0 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
239f0 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
23a00 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20  exedBy, 0);.    
23a10 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
23a20 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
23a30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
23a40 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
23a50 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20  pFrom->pIBIndex 
23a60 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
23a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23a80 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
23a90 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
23aa0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
23ab0 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
23ac0 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
23ad0 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
23ae0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23af0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
23b00 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
23b10 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
23b20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
23b30 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
23b40 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
23b50 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
23b60 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
23b70 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
23b80 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
23b90 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
23ba0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
23bb0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
23bc0 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
23bd0 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
23be0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
23bf0 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
23c00 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
23c10 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
23c20 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
23c30 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
23c40 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
23c50 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
23c60 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
23c70 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
23c80 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
23c90 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
23ca0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
23cb0 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
23cc0 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
23cd0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
23ce0 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
23cf0 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
23d00 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
23d10 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
23d20 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
23d30 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
23d40 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
23d50 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
23d60 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
23d70 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
23d80 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
23d90 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
23da0 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
23db0 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
23dc0 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
23dd0 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
23de0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
23df0 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
23e00 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
23e10 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
23e20 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
23e30 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
23e40 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
23e50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
23e60 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
23e70 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
23e80 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
23e90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
23ea0 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
23eb0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
23ec0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23ed0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
23ee0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
23ef0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23f00 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
23f10 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
23f20 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
23f30 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
23f40 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
23f50 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
23f60 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
23f70 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
23f80 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
23f90 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
23fa0 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
23fb0 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
23fc0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
23fd0 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
23fe0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
23ff0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
24000 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
24010 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
24020 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
24030 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
24040 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
24050 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
24060 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
24070 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
24080 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
24090 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
240a0 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
240b0 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
240c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
240d0 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
240e0 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
240f0 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
24100 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
24110 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
24120 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
24130 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
24140 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
24150 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
24160 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
24170 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
24180 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
24190 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
241a0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
241b0 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
241c0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53  e3Expr(db, TK_AS
241d0 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70  TERISK, 0));.  p
241e0 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
241f0 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
24200 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  0;.  pNew->pGrou
24210 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  pBy = 0;.  pNew-
24220 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  >pHaving = 0;.  
24230 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
24240 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   0;.  p->pPrior 
24250 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  = 0;.  p->pNext 
24260 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20  = 0;.  p->pWith 
24270 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  = 0;.  p->selFla
24280 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
24290 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  nd;.  assert( (p
242a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
242b0 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b  Converted)==0 );
242c0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
242d0 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a  = SF_Converted;.
242e0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
242f0 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70  pPrior!=0 );.  p
24300 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  New->pPrior->pNe
24310 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
24320 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->pLimit = 0;. 
24330 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
24340 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  inue;.}../*.** C
24350 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
24360 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
24370 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74 61  erm pFrom has ta
24380 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74  ble-valued funct
24390 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ion.** arguments
243a0 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6c  .  If it does, l
243b0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
243c0 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20  ssage in pParse 
243d0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
243e0 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70 46  n-zero, since pF
243f0 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  rom is not allow
24400 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c 65  ed to be a table
24410 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e  -valued function
24420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24430 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
24440 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24450 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24460 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
24470 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54  f( pFrom->fg.isT
24480 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71  abFunc ){.    sq
24490 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
244a0 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e  arse, "'%s' is n
244b0 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20  ot a function", 
244c0 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pFrom->zName);. 
244d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
244e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
244f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24500 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72  MIT_CTE./*.** Ar
24510 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68  gument pWith (wh
24520 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29  ich may be NULL)
24530 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e   points to a lin
24540 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74  ked list of nest
24550 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74  ed .** WITH cont
24560 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72  exts, from inner
24570 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49   to outermost. I
24580 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  f the table iden
24590 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52  tified by .** FR
245a0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
245b0 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c  t pItem is reall
245c0 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  y a common-table
245d0 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45  -expression (CTE
245e0 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ) .** then retur
245f0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24600 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f  he CTE definitio
24610 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  n for that table
24620 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72  . Otherwise.** r
24630 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
24640 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * If a non-NULL 
24650 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
24660 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78  d, set *ppContex
24670 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
24680 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74  e With.** object
24690 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
246a0 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74  ed CTE belongs t
246b0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  o..*/.static str
246c0 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57  uct Cte *searchW
246d0 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69  ith(.  With *pWi
246e0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
246f0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
24700 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48  t innermost WITH
24710 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
24720 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
24730 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20   *pItem,     /* 
24740 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
24750 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a  ent to resolve *
24760 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e  /.  With **ppCon
24770 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  text            
24780 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48      /* OUT: WITH
24790 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76   clause return v
247a0 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  alue belongs to 
247b0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
247c0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
247d0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
247e0 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d  e==0 && (zName =
247f0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d   pItem->zName)!=
24800 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
24810 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74  ;.    for(p=pWit
24820 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65  h; p; p=p->pOute
24830 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  r){.      int i;
24840 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
24850 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
24860 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
24870 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
24880 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  e, p->a[i].zName
24890 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
248a0 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70    *ppContext = p
248b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
248c0 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20  rn &p->a[i];.   
248d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
248e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
248f0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  n 0;.}../* The c
24900 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61  ode generator ma
24910 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20  intains a stack 
24920 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63  of active WITH c
24930 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74  lauses.** with t
24940 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49  he inner-most WI
24950 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20  TH clause being 
24960 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
24970 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
24980 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68  his routine push
24990 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75  es the WITH clau
249a0 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
249b0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
249c0 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70  .** onto the top
249d0 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49   of the stack. I
249e0 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65  f argument bFree
249f0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
24a00 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75  his.** WITH clau
24a10 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  se will never be
24a20 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
24a30 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20   stack. In this 
24a40 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c  case it.** shoul
24a50 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  d be freed along
24a60 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20   with the Parse 
24a70 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72  object. In other
24a80 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20   cases, when.** 
24a90 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69  bFree==0, the Wi
24aa0 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  th object will b
24ab0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
24ac0 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  th the SELECT .*
24ad0 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  * statement with
24ae0 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73   which it is ass
24af0 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ociated..*/.void
24b00 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
24b10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24b20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20  With *pWith, u8 
24b30 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74  bFree){.  assert
24b40 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70  ( bFree==0 || (p
24b50 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20  Parse->pWith==0 
24b60 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  && pParse->pWith
24b70 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20  ToFree==0) );.  
24b80 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
24b90 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
24ba0 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29 3b  >pWith!=pWith );
24bb0 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74  .    pWith->pOut
24bc0 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  er = pParse->pWi
24bd0 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
24be0 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
24bf0 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20 70     if( bFree ) p
24c00 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
24c10 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a  ee = pWith;.  }.
24c20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24c30 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
24c40 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20   argument pFrom 
24c50 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20  refers to a CTE 
24c60 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20  declared by .** 
24c70 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e  a WITH clause on
24c80 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65   the stack curre
24c90 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20  ntly maintained 
24ca0 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41  by the parser. A
24cb0 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e  nd,.** if curren
24cc0 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
24cd0 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c   CTE expression,
24ce0 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75   if it is a recu
24cf0 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e  rsive.** referen
24d00 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ce to the curren
24d10 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t CTE..**.** If 
24d20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f  pFrom falls into
24d30 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74   either of the t
24d40 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62  wo categories ab
24d50 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ove, pFrom->pTab
24d60 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69  .** and other fi
24d70 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74  elds are populat
24d80 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
24d90 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
24da0 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f  d check.** (pFro
24db0 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64  m->pTab!=0) to d
24dc0 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
24dd0 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73   or not a succes
24de0 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61  sful match.** wa
24df0 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  s found..**.** W
24e00 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
24e10 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20  match is found, 
24e20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
24e30 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
24e40 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20  r.** occurs. If 
24e50 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
24e60 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  cur, an error me
24e70 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
24e80 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72  in the.** parser
24e90 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20   and some error 
24ea0 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20  code other than 
24eb0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
24ec0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
24ed0 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20  t withExpand(.  
24ee0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
24ef0 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69   .  struct SrcLi
24f00 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29  st_item *pFrom.)
24f10 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
24f20 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
24f30 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rse;.  sqlite3 *
24f40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
24f50 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70  .  struct Cte *p
24f60 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cte;            
24f70 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54     /* Matched CT
24f80 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  E (or NULL if no
24f90 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74   match) */.  Wit
24fa0 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20  h *pWith;       
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24fc0 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74  WITH clause that
24fd0 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f   pCte belongs to
24fe0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
24ff0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
25000 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63  ..  pCte = searc
25010 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57  hWith(pParse->pW
25020 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69  ith, pFrom, &pWi
25030 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20  th);.  if( pCte 
25040 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
25050 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ab;.    ExprList
25060 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65   *pEList;.    Se
25070 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20  lect *pSel;.    
25080 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20  Select *pLeft;  
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
250a0 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   Left-most SELEC
250b0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
250c0 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72     int bMayRecur
250d0 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  sive;           
250e0 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70   /* True if comp
250f0 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55  ound joined by U
25100 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20  NION [ALL] */.  
25110 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69    With *pSavedWi
25120 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
25130 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
25140 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74   of pParse->pWit
25150 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  h */..    /* If 
25160 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
25170 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69   non-NULL at thi
25180 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
25190 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c  is is an illegal
251a0 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
251b0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43  e reference to C
251c0 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61  TE pCte. Leave a
251d0 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
251e0 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  e and return.   
251f0 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43   ** early. If pC
25200 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e  te->zCteErr is N
25210 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
25220 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
25230 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20  e reference..   
25240 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
25250 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
25260 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74     if( pCte->zCt
25270 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  eErr ){.      sq
25280 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25290 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65  arse, pCte->zCte
252a0 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  Err, pCte->zName
252b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
252c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
252d0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e 6e    }.    if( cann
252e0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
252f0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  rse, pFrom) ) re
25300 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25310 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  R;..    assert( 
25320 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
25330 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
25340 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
25350 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
25360 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
25370 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
25380 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
25390 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
253a0 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
253b0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
253c0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
253d0 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
253e0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
253f0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62  y = -1;.    pTab
25400 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
25410 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
25420 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
25430 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70  048576) );.    p
25440 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
25450 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20   TF_Ephemeral | 
25460 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
25470 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53  d;.    pFrom->pS
25480 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
25490 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74  electDup(db, pCt
254a0 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
254b0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
254c0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
254d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
254e0 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
254f0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
25500 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
25510 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
25520 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a  cursive CTE. */.
25530 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d      pSel = pFrom
25540 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62  ->pSelect;.    b
25550 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28  MayRecursive = (
25560 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   pSel->op==TK_AL
25570 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54  L || pSel->op==T
25580 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69  K_UNION );.    i
25590 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
255a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
255b0 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a  .      SrcList *
255c0 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSrc = pFrom->pS
255d0 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20  elect->pSrc;.   
255e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
255f0 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
25600 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
25610 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
25620 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d  em = &pSrc->a[i]
25630 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
25640 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
25650 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
25660 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a  Item->zName!=0 .
25670 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
25680 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
25690 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65  tem->zName, pCte
256a0 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20  ->zName).       
256b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
256c0 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pItem->pTab = pT
256d0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ab;.          pI
256e0 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  tem->fg.isRecurs
256f0 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ive = 1;.       
25700 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
25710 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ++;.          pS
25720 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  el->selFlags |= 
25730 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20  SF_Recursive;.  
25740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25750 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e      }..    /* On
25760 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65  ly one recursive
25770 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65   reference is pe
25780 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20  rmitted. */ .   
25790 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
257a0 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
257b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
257c0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
257d0 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
257e0 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
257f0 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
25800 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
25810 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
25820 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
25830 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
25840 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d   pTab->nTabRef==
25850 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  1 || .          
25860 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61    ((pSel->selFla
25870 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29  gs&SF_Recursive)
25880 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52 65   && pTab->nTabRe
25890 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43  f==2 ));..    pC
258a0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63  te->zCteErr = "c
258b0 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
258c0 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
258d0 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
258e0 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
258f0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
25900 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  h;.    if( bMayR
25910 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
25920 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
25930 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
25940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25950 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20  Prior->pWith==0 
25960 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
25970 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70  >pWith = pSel->p
25980 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c 69  With;.      sqli
25990 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
259a0 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a  alker, pPrior);.
259b0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57        pPrior->pW
259c0 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ith = 0;.    }el
259d0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
259e0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
259f0 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
25a00 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  }.    pParse->pW
25a10 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20  ith = pWith;..  
25a20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c    for(pLeft=pSel
25a30 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b  ; pLeft->pPrior;
25a40 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50   pLeft=pLeft->pP
25a50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73  rior);.    pELis
25a60 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73  t = pLeft->pELis
25a70 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  t;.    if( pCte-
25a80 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  >pCols ){.      
25a90 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
25aa0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74  List->nExpr!=pCt
25ab0 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20  e->pCols->nExpr 
25ac0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25ad0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25ae0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
25af0 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25   %d values for %
25b00 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20  d columns",.    
25b10 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e          pCte->zN
25b20 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ame, pEList->nEx
25b30 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr, pCte->pCols-
25b40 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  >nExpr.        )
25b50 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
25b60 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
25b70 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65  With;.        re
25b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25b90 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
25ba0 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e   pEList = pCte->
25bb0 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  pCols;.    }..  
25bc0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
25bd0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
25be0 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54  rse, pEList, &pT
25bf0 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
25c00 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20  >aCol);.    if( 
25c10 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
25c20 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
25c30 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
25c40 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
25c50 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
25c60 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  r = "multiple re
25c70 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
25c80 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  es: %s";.      }
25c90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
25ca0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72  te->zCteErr = "r
25cb0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
25cc0 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79  ce in a subquery
25cd0 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  : %s";.      }. 
25ce0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25cf0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
25d00 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
25d10 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
25d20 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
25d30 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
25d40 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  th;.  }..  retur
25d50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
25d60 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
25d70 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
25d80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
25d90 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65  CT passed as the
25da0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
25db0 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74   has an associat
25dc0 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75  ed WITH .** clau
25dd0 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20  se, pop it from 
25de0 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64  the stack stored
25df0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
25e00 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Parse object..**
25e10 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25e20 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  n is used as the
25e30 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
25e40 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a  2() callback by.
25e50 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
25e60 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61  Expand() when wa
25e70 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74  lking a SELECT t
25e80 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  ree to resolve t
25e90 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e  able.** names an
25ea0 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  d other FROM cla
25eb0 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a  use elements. .*
25ec0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
25ed0 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b  lectPopWith(Walk
25ee0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
25ef0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
25f00 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
25f10 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 66  er->pParse;.  if
25f20 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
25f30 52 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69 74  RUE(pParse->pWit
25f40 68 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d  h) && p->pPrior=
25f50 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
25f60 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
25f70 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
25f80 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21 3d  .    if( pWith!=
25f90 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
25fa0 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
25fb0 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 20  ==pWith );.     
25fc0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25fd0 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a   pWith->pOuter;.
25fe0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
25ff0 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74  e.#define select
26000 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66  PopWith 0.#endif
26010 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
26020 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72  tine is a Walker
26030 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65   callback for "e
26040 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45  xpanding" a SELE
26050 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
26060 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61   "Expanding" mea
26070 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c  ns to do the fol
26080 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
26090 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
260a0 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
260b0 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
260c0 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
260d0 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
260e0 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
260f0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
26100 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
26110 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
26120 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
26130 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
26140 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
26150 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
26160 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
26170 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
26180 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
26190 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
261a0 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
261b0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
261c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
261d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
261e0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
261f0 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
26200 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
26210 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
26220 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
26230 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
26240 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
26250 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
26260 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
26270 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
26280 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
26290 75 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  up the persisten
262a0 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
262b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
262c0 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
262d0 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
262e0 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
262f0 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64  ause to accommod
26300 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
26310 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
26320 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
26330 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
26340 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
26350 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
26360 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
26370 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
26380 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
26390 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
263a0 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
263b0 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
263c0 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
263d0 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
263e0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
263f0 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
26400 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
26410 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
26420 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
26430 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
26440 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
26450 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
26460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
26470 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
26480 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
26490 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
264a0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
264b0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
264c0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
264d0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
264e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
264f0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
26500 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
26510 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
26520 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
26530 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
26540 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
26550 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
26560 73 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20  selFlags;.  u32 
26570 65 6c 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a  elistFlags = 0;.
26580 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
26590 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
265a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
265b0 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
265c0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
265d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
265e0 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66  >pSrc!=0 );.  if
265f0 28 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  ( (selFlags & SF
26600 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
26610 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
26620 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
26630 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
26640 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
26650 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 4f 4b 5f  EList;.  if( OK_
26660 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
26670 2d 3e 70 57 69 74 68 29 20 29 7b 0a 20 20 20 20  ->pWith) ){.    
26680 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
26690 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68  pParse, p->pWith
266a0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
266b0 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
266c0 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
266d0 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
266e0 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
266f0 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
26700 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
26710 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
26720 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
26730 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
26740 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
26750 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
26760 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
26770 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
26780 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
26790 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
267a0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
267b0 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
267c0 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
267d0 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
267e0 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
267f0 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
26800 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
26810 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
26820 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
26830 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
26840 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
26850 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
26860 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
26870 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
26880 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26890 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
268a0 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54  ==0 || pFrom->pT
268b0 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
268c0 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
268d0 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75  ursive ) continu
268e0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
268f0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
26900 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26910 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28  OMIT_CTE.    if(
26920 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c   withExpand(pWal
26930 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  ker, pFrom) ) re
26940 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26950 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
26960 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65  Tab ) {} else.#e
26970 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72  ndif.    if( pFr
26980 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
26990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
269a0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
269b0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
269c0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
269d0 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
269e0 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
269f0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
26a00 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
26a10 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
26a20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26a30 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
26a40 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
26a50 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
26a60 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72  alker, pSel) ) r
26a70 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26a80 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
26a90 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
26aa0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
26ab0 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
26ac0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
26ad0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
26ae0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
26af0 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
26b00 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  1;.      if( pFr
26b10 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  om->zAlias ){.  
26b20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
26b30 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
26b40 44 75 70 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a  Dup(db, pFrom->z
26b50 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 65  Alias);.      }e
26b60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
26b70 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
26b80 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
26b90 75 62 71 75 65 72 79 5f 25 70 22 2c 20 28 76 6f  ubquery_%p", (vo
26ba0 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
26bb0 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
26bc0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
26bd0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
26be0 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  ior; }.      sql
26bf0 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
26c00 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
26c10 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
26c20 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
26c30 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
26c40 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
26c50 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
26c60 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
26c70 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
26c80 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
26c90 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
26ca0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
26cb0 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
26cc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26cd0 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
26ce0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
26cf0 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
26d00 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
26d10 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
26d20 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
26d30 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
26d40 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
26d50 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
26d60 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
26d70 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
26d80 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
26d90 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
26da0 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78  Tab->nTabRef>=0x
26db0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
26dc0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
26dd0 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
26de0 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
26df0 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
26e00 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
26e10 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
26e20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
26e30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
26e40 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
26e60 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
26e70 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74       if( !IsVirt
26e80 75 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e  ual(pTab) && can
26e90 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
26ea0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
26eb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
26ec0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
26ed0 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  }.#if !defined(S
26ee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
26ef0 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
26f00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
26f10 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
26f20 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
26f30 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  ) || pTab->pSele
26f40 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31  ct ){.        i1
26f50 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  6 nCol;.        
26f60 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
26f70 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
26f80 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
26f90 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26fa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26fb0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
26fc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
26fd0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
26fe0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
26ff0 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
27000 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
27010 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
27020 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  me(pFrom->pSelec
27030 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
27040 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
27050 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  pTab->nCol;.    
27060 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
27070 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   -1;.        sql
27080 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
27090 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
270a0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
270b0 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43   pTab->nCol = nC
270c0 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ol;.      }.#end
270d0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
270e0 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
270f0 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
27100 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
27110 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
27120 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
27130 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
27140 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
27150 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
27160 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
27170 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
27180 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
27190 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
271a0 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
271b0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
271c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
271d0 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
271e0 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
271f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
27200 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
27210 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
27220 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
27230 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
27240 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
27250 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
27260 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
27270 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
27280 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
27290 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
272a0 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
272b0 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
272c0 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
272d0 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
272e0 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
272f0 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70  e TK_ASTERISK op
27300 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
27310 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
27320 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  d in the column.
27330 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20    ** list.  The 
27340 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
27350 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
27360 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  e the TK_ASTERIS
27370 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  K.  ** expressio
27380 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61  ns and expand ea
27390 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
273a0 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
273b0 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61  s in.  ** all ta
273c0 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
273d0 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
273e0 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
273f0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
27400 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
27410 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
27420 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
27430 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
27440 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
27450 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
27460 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
27470 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
27480 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
27490 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
274a0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
274b0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
274c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
274d0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
274e0 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
274f0 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
27500 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
27510 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
27520 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
27530 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
27540 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c   ) break;.    el
27550 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e  istFlags |= pE->
27560 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28  flags;.  }.  if(
27570 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
27580 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
27590 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
275a0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
275b0 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
275c0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
275d0 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
275e0 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
275f0 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
27600 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
27610 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
27620 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
27630 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
27640 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
27650 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
27660 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
27670 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
27680 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
27690 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
276a0 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
276b0 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
276c0 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
276d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
276e0 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27700 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
27710 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
27720 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
27730 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
27740 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
27750 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
27760 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c  .pExpr;.      el
27770 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e  istFlags |= pE->
27780 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69  flags;.      pRi
27790 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
277a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
277b0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
277c0 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
277d0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
277e0 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20  =TK_ASTERISK.   
277f0 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d      && (pE->op!=
27800 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
27810 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53  ->op!=TK_ASTERIS
27820 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  K).      ){.    
27830 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
27840 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
27850 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
27860 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
27870 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27880 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
27890 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
278a0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
278b0 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
278c0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
278d0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
278e0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
278f0 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
27900 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
27910 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
27920 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
27930 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
27940 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
27950 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
27960 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
27970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
27980 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
27990 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
279a0 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
279b0 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
279c0 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
279d0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
279e0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
279f0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
27a00 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
27a10 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
27a20 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
27a30 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
27a40 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
27a50 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
27a60 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
27a70 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
27a80 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
27a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
27aa0 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
27ab0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
27ac0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
27ad0 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
27ae0 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
27af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
27b00 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
27b10 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
27b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
27b30 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
27b40 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
27b50 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
27b60 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
27b70 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
27b80 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
27b90 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
27ba0 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
27bb0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
27bc0 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
27bd0 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
27be0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
27bf0 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
27c00 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
27c10 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
27c20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
27c30 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
27c40 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
27c50 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
27c60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27c70 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
27c80 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
27c90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
27ca0 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
27cb0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
27cc0 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
27cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
27ce0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
27cf0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
27d00 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
27d10 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
27d20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
27d30 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27d40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27d50 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
27d60 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
27d70 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
27d80 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
27d90 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
27da0 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
27db0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
27dc0 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
27dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
27de0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
27df0 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
27e00 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
27e10 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
27e20 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
27e30 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
27e40 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
27e50 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
27e60 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
27e70 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
27e80 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
27e90 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
27ea0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
27eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
27ec0 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
27ed0 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
27ee0 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
27ef0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
27f00 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
27f10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27f20 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
27f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
27f40 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
27f50 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
27f60 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
27f70 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
27f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
27fa0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
27fb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
27fc0 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
27fd0 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
27fe0 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74  hidden', omit it
27ff0 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64   from the expand
28000 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
28010 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
28020 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c  t unless the SEL
28030 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49  ECT has the SF_I
28040 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20  ncludeHidden.   
28050 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20           ** bit 
28060 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  set..           
28070 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28080 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
28090 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64   & SF_IncludeHid
280a0 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  den)==0.        
280b0 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e       && IsHidden
280c0 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
280d0 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20  ol[j]) .        
280e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
280f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28100 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28110 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
28120 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
28130 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
28140 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
28150 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
28160 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pFrom->fg.jointy
28170 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
28180 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
28190 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43      && tableAndC
281a0 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c  olumnIndex(pTabL
281b0 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  ist, i, zName, 0
281c0 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  , 0).           
281d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
281e0 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
281f0 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
28200 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
28210 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
28220 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
28230 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68  able to the righ
28240 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
28250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28260 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28270 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28280 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
28290 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
282a0 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pFrom->pUsing, z
282b0 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
282c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
282d0 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
282e0 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
282f0 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
28300 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
28310 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
28320 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
28330 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
28340 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
28350 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
28360 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28380 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
28390 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
283a0 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  K_ID, zName);.  
283b0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
283c0 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
283d0 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
283e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
283f0 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c   if( longNames |
28400 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
28410 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
28420 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
28430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28440 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
28450 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54  pr(db, TK_ID, zT
28460 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
28470 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
28480 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
28490 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
284a0 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
284b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
284c0 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
284e0 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
284f0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
28500 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
28510 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
28520 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
28530 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
28540 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  Left, pExpr);.  
28550 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28560 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28570 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
28590 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
285a0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
285b0 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
285c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
285d0 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
285e0 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
285f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28610 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
28620 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
28630 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28640 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
28650 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
28660 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
28670 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
28680 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
28690 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20  Init(&sColname, 
286a0 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
286b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
286c0 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
286d0 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
286e0 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
286f0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
28700 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
28710 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
28720 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
28730 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
28740 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20  List_item *pX = 
28750 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e  &pNew->a[pNew->n
28760 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20  Expr-1];.       
28770 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20         if( pSub 
28780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28790 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
287a0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
287b0 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  b, pSub->pEList-
287c0 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[j].zSpan);.  
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
287e0 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
287f0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
28800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
28820 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
28830 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
28840 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %s.%s",.        
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20     zSchemaName, 
28880 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  zTabName, zColna
28890 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
288a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
288b0 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
288e0 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b  >bSpanIsTab = 1;
288f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28900 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28910 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
28920 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
28930 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28940 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
28950 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
28960 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
28970 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28980 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
28990 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
289a0 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
289b0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
289c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
289d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
289e0 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
289f0 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
28a00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28a10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28a20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
28a30 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
28a40 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
28a50 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
28a60 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69   }.  if( p->pELi
28a70 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  st ){.    if( p-
28a80 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
28a90 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
28aa0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
28ab0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
28ac0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
28ad0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
28ae0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
28af0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28b00 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
28b10 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46  .    if( (elistF
28b20 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75  lags & (EP_HasFu
28b30 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29  nc|EP_Subquery))
28b40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  !=0 ){.      p->
28b50 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
28b60 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20  omplexResult;.  
28b70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
28b80 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28b90 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
28ba0 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
28bb0 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
28bc0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
28bd0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
28be0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
28bf0 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
28c00 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
28c10 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
28c20 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
28c30 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
28c40 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
28c50 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
28c60 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
28c70 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
28c80 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
28c90 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
28ca0 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
28cb0 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
28cc0 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
28cd0 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
28ce0 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
28cf0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
28d00 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61  3ExprWalkNoop(Wa
28d10 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
28d20 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
28d30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28d40 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
28d50 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
28d60 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28d70 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
28d80 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
28d90 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20  rse-tree walker 
28da0 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
28db0 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65  ments..** subque
28dc0 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
28dd0 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   tree..*/.int sq
28de0 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e  lite3SelectWalkN
28df0 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
28e00 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  sed, Select *Not
28e10 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
28e20 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
28e30 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
28e40 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28e50 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51  tinue;.}..#if SQ
28e60 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
28e70 20 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20   Always assert. 
28e80 20 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c   This xSelectCal
28e90 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74  lback2 implement
28ea0 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61  ation proves tha
28eb0 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74  t the.** xSelect
28ec0 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76  Callback2 is nev
28ed0 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76  er invoked..*/.v
28ee0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
28ef0 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c  tWalkAssert2(Wal
28f00 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65  ker *NotUsed, Se
28f10 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b  lect *NotUsed2){
28f20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28f30 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
28f40 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72  tUsed2);.  asser
28f50 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  t( 0 );.}.#endif
28f60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
28f70 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
28f80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28f90 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
28fa0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
28fb0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
28fc0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
28fd0 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
28fe0 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
28ff0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
29000 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
29010 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
29020 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
29030 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
29040 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
29050 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
29060 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
29070 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
29080 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29090 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
290a0 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
290b0 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
290c0 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
290d0 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
290e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
290f0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
29100 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
29110 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
29120 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
29130 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
29140 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
29150 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
29160 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
29170 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
29180 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
29190 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
291a0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
291b0 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
291c0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
291d0 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
291e0 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
291f0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
29200 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
29210 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
29220 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46  rse;.  if( OK_IF
29230 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61  _ALWAYS_TRUE(pPa
29240 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64  rse->hasCompound
29250 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65  ) ){.    w.xSele
29260 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e  ctCallback = con
29270 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
29280 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20  ctToSubquery;.  
29290 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
292a0 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71  ack2 = 0;.    sq
292b0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
292c0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  &w, pSelect);.  
292d0 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  }.  w.xSelectCal
292e0 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
292f0 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c  pander;.  w.xSel
29300 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
29310 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20  electPopWith;.  
29320 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
29330 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
29340 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
29350 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
29360 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
29370 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
29380 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
29390 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
293a0 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
293b0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
293c0 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
293d0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
293e0 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
293f0 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
29400 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
29410 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
29420 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
29430 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
29440 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
29450 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
29460 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
29470 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
29480 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
29490 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
294a0 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
294b0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
294c0 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
294d0 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
294e0 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
294f0 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
29500 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
29510 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
29520 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
29530 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
29540 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
29550 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
29560 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
29570 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
29580 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
29590 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
295a0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
295b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
295c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
295d0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
295e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
295f0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
29600 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
29610 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
29620 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
29630 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
29640 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
29650 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
29660 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
29670 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
29680 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
29690 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
296a0 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
296b0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
296c0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
296d0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
296e0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
296f0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
29700 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
29710 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
29720 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
29730 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
29740 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
29750 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
29760 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29770 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
29780 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
29790 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
297a0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
297b0 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
297c0 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
297d0 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
297e0 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
297f0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
29800 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
29810 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
29820 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
29830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29840 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
29850 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29860 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
29870 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
29880 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
29890 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
298a0 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
298b0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
298c0 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
298d0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
298e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
298f0 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
29900 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
29910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29920 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
29930 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
29940 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
29950 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
29960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
29970 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
29980 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
29990 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
299a0 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
299b0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
299c0 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
299d0 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
299e0 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
299f0 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
29a00 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
29a10 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
29a20 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
29a30 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
29a40 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
29a50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29a60 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
29a70 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
29a80 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
29a90 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
29aa0 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
29ab0 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
29ac0 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
29ad0 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
29ae0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
29af0 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
29b00 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
29b10 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
29b20 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
29b30 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
29b40 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
29b50 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
29b60 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
29b70 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
29b80 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
29b90 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
29ba0 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
29bb0 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
29bc0 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
29bd0 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
29be0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
29bf0 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
29c00 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
29c10 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
29c20 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
29c30 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
29c40 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
29c50 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
29c60 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
29c70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
29c80 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
29c90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
29ca0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
29cb0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
29cc0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
29cd0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
29ce0 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
29cf0 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
29d00 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
29d10 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  r */.){.  assert
29d20 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p!=0 || pParse
29d30 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
29d40 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ed );.  if( pPar
29d50 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
29d60 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
29d70 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
29d80 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
29d90 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
29da0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
29db0 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
29dc0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
29dd0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
29de0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
29df0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
29e00 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
29e10 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
29e20 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
29e30 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
29e40 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
29e50 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
29e60 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
29e70 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
29e80 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
29e90 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
29ea0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
29eb0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
29ec0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
29ed0 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
29ee0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
29ef0 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
29f00 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
29f10 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
29f20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
29f30 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
29f40 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
29f50 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
29f60 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
29f70 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
29f80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29f90 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
29fa0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29fb0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
29fc0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
29fd0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
29fe0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
29ff0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2a000 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67  Func;.  int nReg
2a010 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   = pAggInfo->nFu
2a020 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  nc + pAggInfo->n
2a030 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52  Column;.  if( nR
2a040 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  eg==0 ) return;.
2a050 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2a060 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
2a070 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f  that all AggInfo
2a080 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77   registers are w
2a090 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2a0a0 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a  specified by.  *
2a0b0 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e  * AggInfo.mnReg.
2a0c0 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a  .AggInfo.mxReg *
2a0d0 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67  /.  assert( nReg
2a0e0 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  ==pAggInfo->mxRe
2a0f0 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  g-pAggInfo->mnRe
2a100 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  g+1 );.  for(i=0
2a110 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
2a120 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2a130 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2a140 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e  o->aCol[i].iMem>
2a150 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2a160 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2a170 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
2a180 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
2a190 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  xReg );.  }.  fo
2a1a0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2a1b0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
2a1c0 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
2a1d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
2a1e0 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
2a1f0 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
2a200 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2a210 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
2a220 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
2a230 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
2a240 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2a250 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
2a260 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67  nfo->mnReg, pAgg
2a270 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20  Info->mxReg);.  
2a280 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
2a290 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
2a2a0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2a2b0 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
2a2c0 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  {.    if( pFunc-
2a2d0 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2a2e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
2a2f0 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
2a300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2a310 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a320 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
2a330 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
2a340 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
2a350 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
2a360 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
2a370 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2a380 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2a390 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
2a3a0 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
2a3b0 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
2a3c0 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
2a3d0 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
2a3e0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2a3f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a400 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2a410 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2a420 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2a430 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30  , pE->x.pList, 0
2a440 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
2a450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2a460 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2a470 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
2a480 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
2a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4a0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
2a4b0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2a4c0 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
2a4d0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2a4e0 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
2a4f0 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
2a500 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
2a510 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
2a520 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
2a530 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
2a540 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
2a550 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
2a560 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
2a570 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
2a580 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2a590 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2a5a0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
2a5b0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
2a5c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
2a5d0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
2a5e0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2a5f0 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
2a600 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2a610 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
2a620 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
2a630 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2a640 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
2a650 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2a660 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2a670 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67  eAddOp2(v, OP_Ag
2a680 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
2a690 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
2a6a0 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
2a6b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
2a6c0 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e  ndP4(v, pF->pFun
2a6d0 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
2a6e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
2a6f0 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
2a700 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
2a710 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
2a720 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
2a730 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2a740 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
2a750 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
2a760 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
2a770 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
2a780 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2a790 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2a7a0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2a7b0 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
2a7c0 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
2a7d0 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
2a7e0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2a7f0 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
2a800 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
2a810 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
2a820 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
2a830 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
2a840 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
2a850 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2a860 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
2a870 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
2a880 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
2a890 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
2a8a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
2a8b0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
2a8c0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
2a8d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2a8e0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
2a8f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2a900 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
2a910 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
2a920 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
2a930 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
2a940 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2a950 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
2a960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2a970 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2a980 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
2a990 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gAgg, 0, SQLITE_
2a9a0 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d  ECEL_DUP);.    }
2a9b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
2a9c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
2a9d0 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
2a9e0 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
2a9f0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
2aa00 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
2aa10 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2aa20 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
2aa30 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20  se( nArg==0 );  
2aa40 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  /* Error conditi
2aa50 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  on */.      test
2aa60 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20  case( nArg>1 ); 
2aa70 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72    /* Also an err
2aa80 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65  or */.      code
2aa90 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
2aaa0 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
2aab0 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
2aac0 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
2aad0 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
2aae0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
2aaf0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
2ab00 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
2ab10 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
2ab20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2ab30 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2ab40 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2ab50 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
2ab60 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
2ab70 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
2ab80 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
2ab90 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
2aba0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
2abb0 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
2abc0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
2abd0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2abe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2abf0 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
2ac00 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2ac10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
2ac20 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
2ac30 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
2ac40 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2ac50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ac60 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
2ac70 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2ac80 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
2ac90 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2aca0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2acb0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
2acc0 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
2acd0 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
2ace0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
2acf0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2ad00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2ad10 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72  P_AggStep0, 0, r
2ad20 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29  egAgg, pF->iMem)
2ad30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2ad40 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d  eAppendP4(v, pF-
2ad50 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
2ad60 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
2ad70 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2ad80 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73  (u8)nArg);.    s
2ad90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
2ada0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
2adb0 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
2adc0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
2add0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2ade0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
2adf0 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
2ae00 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
2ae10 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2ae20 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2ae30 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71  rNext);.      sq
2ae40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2ae50 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2ae60 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66   }.  }..  /* Bef
2ae70 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74  ore populating t
2ae80 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
2ae90 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20  egisters, clear 
2aea0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
2aeb0 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
2aec0 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  , if any of the 
2aed0 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
2aee0 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61  values are alrea
2aef0 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a  dy present .  **
2af00 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73   in registers, s
2af10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
2af20 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70   may use OP_SCop
2af30 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61  y to copy the va
2af40 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e  lue.  ** to pC->
2af50 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65  iMem. But by the
2af60 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20   time the value 
2af70 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69  is used, the ori
2af80 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20  ginal register. 
2af90 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65   ** may have bee
2afa0 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61  n used, invalida
2afb0 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79  ting the underly
2afc0 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69  ing buffer holdi
2afd0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74  ng the.  ** text
2afe0 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20   or blob value. 
2aff0 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30  See ticket [8830
2b000 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20  34dcb5]..  **.  
2b010 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74  ** Another solut
2b020 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ion would be to 
2b030 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43  change the OP_SC
2b040 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79  opy used to copy
2b050 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c   cached.  ** val
2b060 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70  ues to an OP_Cop
2b070 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  y..  */.  if( re
2b080 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72  gHit ){.    addr
2b090 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65  HitTest = sqlite
2b0a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2b0b0 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56  P_If, regHit); V
2b0c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2b0d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
2b0e0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2b0f0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
2b100 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
2b110 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
2b120 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
2b130 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
2b140 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2b150 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
2b160 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
2b170 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
2b180 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  tMode = 0;.  sql
2b190 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2b1a0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  ar(pParse);.  if
2b1b0 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
2b1c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b1d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2b1e0 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
2b1f0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
2b200 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
2b210 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
2b220 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
2b230 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
2b240 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
2b250 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2b260 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
2b270 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b280 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
2b290 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
2b2a0 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
2b2b0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b2d0 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
2b2e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b300 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
2b310 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
2b320 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b340 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
2b350 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
2b360 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
2b370 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
2b380 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  in==2 ){.    int
2b390 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21   bCover = (pIdx!
2b3a0 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28  =0 && (HasRowid(
2b3b0 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d  pTab) || !IsPrim
2b3c0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
2b3d0 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  )));.    char *z
2b3e0 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Eqp = sqlite3MPr
2b3f0 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
2b400 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25   "SCAN TABLE %s%
2b410 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54  s%s",.        pT
2b420 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
2b430 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53     bCover ? " US
2b440 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
2b450 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20  EX " : "",.     
2b460 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78     bCover ? pIdx
2b470 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20  ->zName : "".   
2b480 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
2b490 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
2b4a0 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65     pParse->pVdbe
2b4b0 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
2b4c0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2b4d0 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f   0, 0, zEqp, P4_
2b4e0 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
2b4f0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
2b500 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  ine explainSimpl
2b510 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65  eCount(a,b,c).#e
2b520 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74  ndif../*.** Cont
2b530 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 68  ext object for h
2b540 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72  avingToWhereExpr
2b550 43 62 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Cb()..*/.struct 
2b560 48 61 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78  HavingToWhereCtx
2b570 20 7b 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68   {.  Expr **ppWh
2b580 65 72 65 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ere;.  ExprList 
2b590 2a 70 47 72 6f 75 70 42 79 3b 0a 7d 3b 0a 0a 2f  *pGroupBy;.};../
2b5a0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b  *.** sqlite3Walk
2b5b0 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20  Expr() callback 
2b5c0 75 73 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f  used by havingTo
2b5d0 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Where()..**.** I
2b5e0 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65  f the node passe
2b5f0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  d to the callbac
2b600 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f  k is a TK_AND no
2b610 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57  de, return .** W
2b620 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74  RC_Continue to t
2b630 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ell sqlite3WalkE
2b640 78 70 72 28 29 20 74 6f 20 69 74 65 72 61 74 65  xpr() to iterate
2b650 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e   through child n
2b660 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  odes..**.** Othe
2b670 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52  rwise, return WR
2b680 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73  C_Prune. In this
2b690 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63   case, also chec
2b6a0 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62  k if the .** sub
2b6b0 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63  -expression matc
2b6c0 68 65 73 20 74 68 65 20 63 72 69 74 65 72 69 61  hes the criteria
2b6d0 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64   for being moved
2b6e0 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a   to the WHERE.**
2b6f0 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20   clause. If so, 
2b700 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 57 48  add it to the WH
2b710 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72  ERE clause and r
2b720 65 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65  eplace the sub-e
2b730 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74  xpression.** wit
2b740 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65  hin the HAVING e
2b750 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61  xpression with a
2b760 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a   constant "1"..*
2b770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 76  /.static int hav
2b780 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62  ingToWhereExprCb
2b790 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2b7a0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2b7b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2b7c0 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 73  =TK_AND ){.    s
2b7d0 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68  truct HavingToWh
2b7e0 65 72 65 43 74 78 20 2a 70 20 3d 20 70 57 61 6c  ereCtx *p = pWal
2b7f0 6b 65 72 2d 3e 75 2e 70 48 61 76 69 6e 67 43 74  ker->u.pHavingCt
2b800 78 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  x;.    if( sqlit
2b810 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
2b820 4f 72 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65  OrGroupBy(pWalke
2b830 72 2d 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72  r->pParse, pExpr
2b840 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 20 29  , p->pGroupBy) )
2b850 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
2b860 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  *db = pWalker->p
2b870 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
2b880 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
2b890 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
2b8a0 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
2b8b0 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
2b8c0 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  [1], 0);.      i
2b8d0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
2b8e0 20 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20     Expr *pWhere 
2b8f0 3d 20 2a 28 70 2d 3e 70 70 57 68 65 72 65 29 3b  = *(p->ppWhere);
2b900 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45 78  .        SWAP(Ex
2b910 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70  pr, *pNew, *pExp
2b920 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
2b930 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2b940 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 4e  d(db, pWhere, pN
2b950 65 77 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 70  ew);.        *(p
2b960 2d 3e 70 70 57 68 65 72 65 29 20 3d 20 70 4e 65  ->ppWhere) = pNe
2b970 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
2b980 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
2b990 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
2b9a0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2b9b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
2b9c0 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72  fer eligible ter
2b9d0 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49  ms from the HAVI
2b9e0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71  NG clause of a q
2b9f0 75 65 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a  uery, which is.*
2ba00 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66 74 65  * processed afte
2ba10 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74  r grouping, to t
2ba20 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
2ba30 20 77 68 69 63 68 20 69 73 20 70 72 6f 63 65 73   which is proces
2ba40 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72  sed before.** gr
2ba50 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d  ouping. For exam
2ba60 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a  ple, the query:.
2ba70 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
2ba80 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57   FROM <tables> W
2ba90 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42  HERE a=? GROUP B
2baa0 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41  Y b HAVING b=? A
2bab0 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e  ND c=?.**.** can
2bac0 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
2bad0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
2bae0 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e   * FROM <tables>
2baf0 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62   WHERE a=? AND b
2bb00 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
2bb10 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41  VING c=?.**.** A
2bb20 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56   term of the HAV
2bb30 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ING expression i
2bb40 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74  s eligible for t
2bb50 72 61 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f  ransfer if it co
2bb60 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65  nsists.** entire
2bb70 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20  ly of constants 
2bb80 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20  and expressions 
2bb90 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52  that are also GR
2bba0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74 68 61  OUP BY terms tha
2bbb0 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49  t.** use the "BI
2bbc0 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20  NARY" collation 
2bbd0 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
2bbe0 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54  tic void havingT
2bbf0 6f 57 68 65 72 65 28 0a 20 20 50 61 72 73 65 20  oWhere(.  Parse 
2bc00 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
2bc10 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 0a 20  ist *pGroupBy,. 
2bc20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20   Expr *pHaving, 
2bc30 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2bc40 65 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 48 61  e.){.  struct Ha
2bc50 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20 73  vingToWhereCtx s
2bc60 43 74 78 3b 0a 20 20 57 61 6c 6b 65 72 20 73 57  Ctx;.  Walker sW
2bc70 61 6c 6b 65 72 3b 0a 0a 20 20 73 43 74 78 2e 70  alker;..  sCtx.p
2bc80 70 57 68 65 72 65 20 3d 20 70 70 57 68 65 72 65  pWhere = ppWhere
2bc90 3b 0a 20 20 73 43 74 78 2e 70 47 72 6f 75 70 42  ;.  sCtx.pGroupB
2bca0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 0a 20  y = pGroupBy;.. 
2bcb0 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72   memset(&sWalker
2bcc0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c  , 0, sizeof(sWal
2bcd0 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72  ker));.  sWalker
2bce0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2bcf0 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70  ;.  sWalker.xExp
2bd00 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69  rCallback = havi
2bd10 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b  ngToWhereExprCb;
2bd20 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 48 61  .  sWalker.u.pHa
2bd30 76 69 6e 67 43 74 78 20 3d 20 26 73 43 74 78 3b  vingCtx = &sCtx;
2bd40 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2bd50 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 48 61  pr(&sWalker, pHa
2bd60 76 69 6e 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ving);.}../*.** 
2bd70 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2bd80 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79 20  the pThis entry 
2bd90 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20 61  of pTabList is a
2bda0 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20   self-join of a 
2bdb0 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49  prior view..** I
2bdc0 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72 65  f it is, then re
2bdd0 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73 74  turn the SrcList
2bde0 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70 72  _item for the pr
2bdf0 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69 74  ior view.  If it
2be00 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e   is not,.** then
2be10 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
2be20 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63 4c  atic struct SrcL
2be30 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66  ist_item *isSelf
2be40 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63 4c  JoinView(.  SrcL
2be50 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
2be60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
2be70 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e  ch for self-join
2be80 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20 63  s in this FROM c
2be90 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
2bea0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2beb0 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72 63  pThis   /* Searc
2bec0 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66 65  h for prior refe
2bed0 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73 75  rence to this su
2bee0 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73  bquery */.){.  s
2bef0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2bf00 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72  em *pItem;.  for
2bf10 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  (pItem = pTabLis
2bf20 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68 69  t->a; pItem<pThi
2bf30 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  s; pItem++){.   
2bf40 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
2bf50 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ect==0 ) continu
2bf60 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  e;.    if( pItem
2bf70 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
2bf80 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
2bf90 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
2bfa0 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  me==0 ) continue
2bfb0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2bfc0 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d  3_stricmp(pItem-
2bfd0 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68 69  >zDatabase, pThi
2bfe0 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d 30  s->zDatabase)!=0
2bff0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c000 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2c010 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  icmp(pItem->zNam
2c020 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65 29  e, pThis->zName)
2c030 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
2c040 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2c050 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a 20  xprCompare(0, . 
2c060 20 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e           pThis->
2c070 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c  pSelect->pWhere,
2c080 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
2c090 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a 20 20  >pWhere, -1) .  
2c0a0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
2c0b0 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66  e view was modif
2c0c0 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65  ied by some othe
2c0d0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  r optimization s
2c0e0 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  uch as.      ** 
2c0f0 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
2c100 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ms() */.      co
2c110 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
2c120 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a    return pItem;.
2c130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2c140 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2c150 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
2c160 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  IMIZATION./*.** 
2c170 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73  Attempt to trans
2c180 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66 20  form a query of 
2c190 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
2c1a0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
2c1b0 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  ) FROM (SELECT x
2c1c0 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
2c1d0 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  LL SELECT y FROM
2c1e0 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20   t2).**.** Into 
2c1f0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
2c200 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
2c210 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b  unt(*) FROM t1)+
2c220 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  (SELECT count(*)
2c230 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20   FROM t2).**.** 
2c240 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  The transformati
2c250 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  on only works if
2c260 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
2c270 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
2c280 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73  **.**   *  The s
2c290 75 62 71 75 65 72 79 20 69 73 20 61 20 55 4e 49  ubquery is a UNI
2c2a0 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72  ON ALL of two or
2c2b0 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20   more terms.**  
2c2c0 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20   *  There is no 
2c2d0 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42  WHERE or GROUP B
2c2e0 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75  Y or HAVING clau
2c2f0 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75  ses on the subqu
2c300 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68  eries.**   *  Th
2c310 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
2c320 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28   a simple count(
2c330 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  *).**.** Return 
2c340 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74 69  TRUE if the opti
2c350 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64 65  mization is unde
2c360 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  rtaken..*/.stati
2c370 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65  c int countOfVie
2c380 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61  wOptimization(Pa
2c390 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
2c3a0 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63  ect *p){.  Selec
2c3b0 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f 72  t *pSub, *pPrior
2c3c0 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  ;.  Expr *pExpr;
2c3d0 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b  .  Expr *pCount;
2c3e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2c3f0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
2c400 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2c410 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  e)==0 ) return 0
2c420 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  ;   /* This is a
2c430 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
2c440 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
2c450 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
2c460 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2c470 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73     /* Single res
2c480 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
2c490 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
2c4a0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
2c4b0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
2c4c0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2c4d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2c4e0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20     /* Result is 
2c4f0 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
2c500 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2c510 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  ricmp(pExpr->u.z
2c520 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29  Token,"count") )
2c530 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49   return 0;  /* I
2c540 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69  s count() */.  i
2c550 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  f( pExpr->x.pLis
2c560 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t!=0 ) return 0;
2c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c580 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e   /* Must be coun
2c590 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t(*) */.  if( p-
2c5a0 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29  >pSrc->nSrc!=1 )
2c5b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2c5d0 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d  ne table in FROM
2c5e0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d    */.  pSub = p-
2c5f0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
2c600 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d  ect;.  if( pSub=
2c610 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
2c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c630 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c640 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65  FROM is a subque
2c650 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ry */.  if( pSub
2c660 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65  ->pPrior==0 ) re
2c670 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
2c680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
2c690 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t be a compound 
2c6a0 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  ry */.  do{.    
2c6b0 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b  if( pSub->op!=TK
2c6c0 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50  _ALL && pSub->pP
2c6d0 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
2c6e0 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49    /* Must be UNI
2c6f0 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66  ON ALL */.    if
2c700 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
2c710 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c730 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75  /* No WHERE clau
2c740 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  se */.    if( pS
2c750 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
2c760 46 5f 41 67 67 72 65 67 61 74 65 20 29 20 72 65  F_Aggregate ) re
2c770 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e  turn 0;     /* N
2c780 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
2c790 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53  */.    pSub = pS
2c7a0 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20  ub->pPrior;     
2c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65           /* Repe
2c7d0 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64  at over compound
2c7e0 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53   */.  }while( pS
2c7f0 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ub );..  /* If w
2c800 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
2c810 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b  nt then it is OK
2c820 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
2c830 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a  transformation *
2c840 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  /..  db = pParse
2c850 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d  ->db;.  pCount =
2c860 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20   pExpr;.  pExpr 
2c870 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d  = 0;.  pSub = p-
2c880 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
2c890 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e  ect;.  p->pSrc->
2c8a0 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30  a[0].pSelect = 0
2c8b0 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
2c8c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
2c8d0 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63  pSrc);.  p->pSrc
2c8e0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2c8f0 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
2c900 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53  b, sizeof(*p->pS
2c910 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  rc));.  while( p
2c920 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20  Sub ){.    Expr 
2c930 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69  *pTerm;.    pPri
2c940 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f  or = pSub->pPrio
2c950 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72  r;.    pSub->pPr
2c960 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ior = 0;.    pSu
2c970 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  b->pNext = 0;.  
2c980 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73    pSub->selFlags
2c990 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
2c9a0 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46  ;.    pSub->selF
2c9b0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
2c9c0 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e  ound;.    pSub->
2c9d0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
2c9e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2c9f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  istDelete(db, pS
2ca00 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
2ca10 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20   pTerm = pPrior 
2ca20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  ? sqlite3ExprDup
2ca30 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20  (db, pCount, 0) 
2ca40 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53  : pCount;.    pS
2ca50 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ub->pEList = sql
2ca60 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
2ca70 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54  nd(pParse, 0, pT
2ca80 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  erm);.    pTerm 
2ca90 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2caa0 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
2cab0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2cac0 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65  ite3PExprAddSele
2cad0 63 74 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ct(pParse, pTerm
2cae0 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28  , pSub);.    if(
2caf0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
2cb00 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d     pExpr = pTerm
2cb10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2cb20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
2cb30 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2cb40 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20  TK_PLUS, pTerm, 
2cb50 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2cb60 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b    pSub = pPrior;
2cb70 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74  .  }.  p->pEList
2cb80 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  ->a[0].pExpr = p
2cb90 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  Expr;.  p->selFl
2cba0 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65  ags &= ~SF_Aggre
2cbb0 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43  gate;..#if SELEC
2cbc0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2cbd0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2cbe0 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
2cbf0 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2cc00 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
2cc10 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d  p,("After count-
2cc20 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61  of-view optimiza
2cc30 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
2cc40 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2cc50 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2cc60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2cc70 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
2cc80 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f  /* SQLITE_COUNTO
2cc90 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49  FVIEW_OPTIMIZATI
2cca0 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ON */../*.** Gen
2ccb0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
2ccc0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2ccd0 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ent given in the
2cce0 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a   p argument.  .*
2ccf0 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
2cd00 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63   are returned ac
2cd10 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53  cording to the S
2cd20 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
2cd30 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ure..** See comm
2cd40 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e  ents in sqliteIn
2cd50 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20  t.h for further 
2cd60 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
2cd70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2cd80 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
2cd90 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
2cda0 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
2cdb0 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
2cdc0 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
2cdd0 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
2cde0 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
2cdf0 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2ce00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2ce10 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
2ce20 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
2ce30 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
2ce40 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
2ce50 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
2ce60 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
2ce70 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
2ce80 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
2ce90 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2cea0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2ceb0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
2cec0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2ced0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
2cee0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
2cef0 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
2cf00 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
2cf10 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
2cf20 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
2cf30 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
2cf40 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
2cf50 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2cf60 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
2cf70 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2cf80 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
2cf90 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2cfa0 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
2cfb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cfc0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
2cfd0 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
2cfe0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
2cff0 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
2d000 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2d010 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
2d020 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
2d030 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
2d040 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69  List = 0;  /* Li
2d050 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
2d060 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
2d070 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2d080 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
2d090 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
2d0a0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
2d0b0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
2d0c0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2d0d0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
2d0e0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
2d0f0 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
2d100 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
2d110 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2d120 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
2d130 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
2d140 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
2d150 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
2d160 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63  NULL */.  int rc
2d170 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2d180 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
2d190 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
2d1a0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74  nction */.  Dist
2d1b0 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63  inctCtx sDistinc
2d1c0 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f  t; /* Info on ho
2d1d0 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49  w to code the DI
2d1e0 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a  STINCT keyword *
2d1f0 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72  /.  SortCtx sSor
2d200 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t;         /* In
2d210 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
2d220 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
2d230 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e  lause */.  AggIn
2d240 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
2d250 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
2d260 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
2d270 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
2d280 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
2d290 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
2d2a0 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
2d2b0 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
2d2c0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2d2d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
2d2e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2d2f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2d300 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20 3d  pMinMaxOrderBy =
2d310 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f 52   0;  /* Added OR
2d320 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f 6d  DER BY for min/m
2d330 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  ax queries */.  
2d340 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20 20  u8 minMaxFlag;  
2d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d360 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f 6d  * Flag for min/m
2d370 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a 23  ax queries */..#
2d380 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d390 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
2d3a0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2d3b0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
2d3c0 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
2d3d0 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
2d3e0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2d3f0 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
2d400 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2d410 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
2d420 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2d430 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
2d440 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
2d450 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2d460 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2d470 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
2d480 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
2d490 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
2d4a0 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
2d4b0 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
2d4c0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2d4d0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72  E_ENABLED.  pPar
2d4e0 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
2d4f0 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  t++;.  SELECTTRA
2d500 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
2d510 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
2d520 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73  g:\n"));.  if( s
2d530 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2d540 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2d550 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2d560 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2d570 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
2d580 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2d590 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2d5a0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
2d5b0 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2d5c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2d5d0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2d5e0 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
2d5f0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2d600 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2d610 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
2d620 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
2d630 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2d640 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d650 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
2d660 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
2d670 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2d680 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
2d690 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
2d6a0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
2d6b0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
2d6c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
2d6d0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d6e0 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
2d6f0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
2d700 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
2d710 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2d720 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
2d730 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d740 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
2d750 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2d760 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
2d770 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
2d780 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
2d790 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
2d7a0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
2d7b0 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
2d7c0 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
2d7d0 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
2d7e0 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
2d7f0 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
2d800 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
2d810 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2d820 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
2d830 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
2d840 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
2d850 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
2d860 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
2d870 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
2d880 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
2d890 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
2d8a0 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
2d8b0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2d8c0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2d8d0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2d8e0 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61 72  pSrc;.  if( pPar
2d8f0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
2d900 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2d910 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2d920 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  end;.  }.  asser
2d930 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
2d940 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  );.  isAgg = (p-
2d950 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2d960 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69  ggregate)!=0;.#i
2d970 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2d980 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2d990 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2d9a0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
2d9b0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2d9c0 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
2d9d0 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
2d9e0 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
2d9f0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2da00 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2da10 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
2da20 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20  t a pointer the 
2da30 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
2da40 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ruction, allocat
2da50 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69  ing a new VDBE i
2da60 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20  f one.  ** does 
2da70 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
2da80 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  t */.  v = sqlit
2da90 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2daa0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
2dab0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2dac0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
2dad0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
2dae0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
2daf0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
2db00 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
2db10 20 54 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20   Try to flatten 
2db20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68  subqueries in th
2db30 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70  e FROM clause up
2db40 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71   into the main q
2db50 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64  uery.  */.#if !d
2db60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2db70 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
2db80 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2db90 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
2dba0 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
2dbb0 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
2dbc0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
2dbd0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2dbe0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
2dbf0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
2dc00 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
2dc10 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
2dc20 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2dc30 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
2dc40 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2dc50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2dc60 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74   /* Catch mismat
2dc70 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72  ch in the declar
2dc80 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20  ed columns of a 
2dc90 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d  view and the num
2dca0 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f  ber of.    ** co
2dcb0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  lumns in the SEL
2dcc0 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a  ECT on the RHS *
2dcd0 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  /.    if( pTab->
2dce0 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69  nCol!=pSub->pELi
2dcf0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
2dd00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2dd10 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65  sg(pParse, "expe
2dd20 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
2dd30 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74  for '%s' but got
2dd40 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
2dd50 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
2dd60 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e  ->nCol, pTab->zN
2dd70 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ame, pSub->pELis
2dd80 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
2dd90 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2dda0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2ddb0 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 66 6c  Do not try to fl
2ddc0 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65 67 61  atten an aggrega
2ddd0 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  te subquery..   
2dde0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61 74 74   **.    ** Flatt
2ddf0 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ening an aggrega
2de00 74 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6f  te subquery is o
2de10 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
2de20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
2de30 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20      ** is not a 
2de40 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68  join.  But if th
2de50 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
2de60 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74 68 65   not a join, the
2de70 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  n the subquery. 
2de80 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6d     ** will be im
2de90 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63  plemented as a c
2dea0 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20 74 68  o-routine and th
2deb0 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74  ere is no advant
2dec0 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 66 6c  age to.    ** fl
2ded0 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68 61 74  attening in that
2dee0 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
2def0 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73 65 6c    if( (pSub->sel
2df00 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
2df10 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  gate)!=0 ) conti
2df20 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2df30 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 3d   pSub->pGroupBy=
2df40 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  =0 );..    /* If
2df50 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2df60 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f 6d   contains a "com
2df70 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73 65 74  plex" result set
2df80 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20 20 2a   (that is,.    *
2df90 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  * if the result 
2dfa0 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
2dfb0 20 71 75 65 72 79 20 75 73 65 73 20 66 75 6e 63   query uses func
2dfc0 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75 65 72  tions or subquer
2dfd0 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ies).    ** and 
2dfe0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
2dff0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52 44 45  contains an ORDE
2e000 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
2e010 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 6c  if.    ** it wil
2e020 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l be implemented
2e030 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
2e040 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c  , then do not fl
2e050 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20 20 20  atten.  This.   
2e060 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   ** restriction 
2e070 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e 73 74  allows SQL const
2e080 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69 73 3a  ructs like this:
2e090 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2e0a0 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69 76 65  SELECT expensive
2e0b0 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20 20 20  _function(x).   
2e0c0 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53 45 4c   **    FROM (SEL
2e0d0 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20 4f  ECT x FROM tab O
2e0e0 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54 20  RDER BY y LIMIT 
2e0f0 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  10);.    **.    
2e100 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69 76 65  ** The expensive
2e110 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 6f  _function() is o
2e120 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f 6e 20  nly computed on 
2e130 74 68 65 20 31 30 20 72 6f 77 73 20 74 68 61 74  the 10 rows that
2e140 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75 74 70  .    ** are outp
2e150 75 74 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  ut, rather than 
2e160 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74 68 65  every row of the
2e170 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
2e180 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75 69 72     ** The requir
2e190 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 6f  ement that the o
2e1a0 75 74 65 72 20 71 75 65 72 79 20 68 61 76 65 20  uter query have 
2e1b0 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75 6c 74  a complex result
2e1c0 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e   set.    ** mean
2e1d0 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
2e1e0 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f 6e 20  g does occur on 
2e1f0 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f 6e 73  simpler SQL cons
2e200 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75 74 0a  traints without.
2e210 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65 6e      ** the expen
2e220 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  sive_function() 
2e230 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  like:.    **.   
2e240 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20 46 52   **  SELECT x FR
2e250 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  OM (SELECT x FRO
2e260 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79  M tab ORDER BY y
2e270 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20   LIMIT 10);.    
2e280 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
2e290 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20 20 20  >pOrderBy!=0.   
2e2a0 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20 20 26    && i==0.     &
2e2b0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
2e2c0 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c   SF_ComplexResul
2e2d0 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  t)!=0.     && (p
2e2e0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
2e2f0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54  .         || (pT
2e300 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e  abList->a[1].fg.
2e310 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46  jointype&(JT_LEF
2e320 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29  T|JT_CROSS))!=0)
2e330 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
2e340 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
2e350 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
2e360 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
2e370 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b 0a 20  , i, isAgg) ){. 
2e380 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
2e390 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
2e3a0 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
2e3b0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
2e3c0 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  i = -1;.    }.  
2e3d0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2e3e0 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62  pSrc;.    if( db
2e3f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e400 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2e410 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
2e420 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2e430 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  t) ){.      sSor
2e440 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
2e450 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
2e460 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
2e470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e480 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
2e490 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
2e4a0 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
2e4b0 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
2e4c0 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
2e4d0 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
2e4e0 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
2e4f0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
2e500 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
2e510 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
2e520 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c  pDest);.    expl
2e530 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
2e540 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2e550 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2e560 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  d);.#if SELECTTR
2e570 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2e580 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2e590 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
2e5a0 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
2e5b0 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
2e5c0 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2e5d0 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
2e5e0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  f.    return rc;
2e5f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2e600 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20  * For each term 
2e610 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2e620 73 65 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e 67  se, do two thing
2e630 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75 74 68  s:.  ** (1) Auth
2e640 6f 72 69 7a 65 64 20 75 6e 72 65 66 65 72 65 6e  orized unreferen
2e650 63 65 64 20 74 61 62 6c 65 73 0a 20 20 2a 2a 20  ced tables.  ** 
2e660 28 32 29 20 47 65 6e 65 72 61 74 65 20 63 6f 64  (2) Generate cod
2e670 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
2e680 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  eries.  */.  for
2e690 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
2e6a0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
2e6b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2e6c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
2e6d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
2e6e0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
2e6f0 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  est;.    Select 
2e700 2a 70 53 75 62 3b 0a 23 69 66 20 21 64 65 66 69  *pSub;.#if !defi
2e710 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2e720 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
2e730 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2e740 54 5f 56 49 45 57 29 0a 20 20 20 20 63 6f 6e 73  T_VIEW).    cons
2e750 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
2e760 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69  thContext;.#endi
2e770 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 20  f..    /* Issue 
2e780 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68  SQLITE_READ auth
2e790 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69 74 68 20  orizations with 
2e7a0 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  a fake column na
2e7b0 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20 20 20 2a  me for any.    *
2e7c0 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20 61 72  * tables that ar
2e7d0 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 75 74  e referenced but
2e7e0 20 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76   from which no v
2e7f0 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61 63  alues are extrac
2e800 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45 78 61 6d  ted..    ** Exam
2e810 70 6c 65 73 20 6f 66 20 77 68 65 72 65 20 74 68  ples of where th
2e820 65 73 65 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c  ese kinds of nul
2e830 6c 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75  l SQLITE_READ au
2e840 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a 20 20 20  thorizations.   
2e850 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63 75 72 3a   ** would occur:
2e860 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2e870 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2e880 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d  *) FROM t1;   --
2e890 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 31 2e   SQLITE_READ t1.
2e8a0 22 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  "".    **     SE
2e8b0 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74  LECT t1.* FROM t
2e8c0 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53 51 4c 49  1, t2;   -- SQLI
2e8d0 54 45 5f 52 45 41 44 20 74 32 2e 22 22 0a 20 20  TE_READ t2."".  
2e8e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2e8f0 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
2e900 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
2e910 69 6e 67 2e 20 20 49 74 20 69 73 20 70 6f 73 73  ing.  It is poss
2e920 69 62 6c 65 20 66 6f 72 20 61 20 74 61 62 6c 65  ible for a table
2e930 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61 76 65 20   to.    ** have 
2e940 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 62  a column named b
2e950 79 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69  y the empty stri
2e960 6e 67 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  ng, in which cas
2e970 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  e there is no wa
2e980 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 74  y to.    ** dist
2e990 69 6e 67 75 69 73 68 20 62 65 74 77 65 65 6e 20  inguish between 
2e9a0 61 6e 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  an unreferenced 
2e9b0 74 61 62 6c 65 20 61 6e 64 20 61 6e 20 61 63 74  table and an act
2e9c0 75 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ual reference to
2e9d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 22 22 20 63   the.    ** "" c
2e9e0 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72 69 67 69  olumn. The origi
2e9f0 6e 61 6c 20 64 65 73 69 67 6e 20 77 61 73 20 66  nal design was f
2ea00 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75  or the fake colu
2ea10 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65 20 61 20  mn name to be a 
2ea20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77 68 69  NULL,.    ** whi
2ea30 63 68 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 6d  ch would be unam
2ea40 62 69 67 75 6f 75 73 2e 20 20 42 75 74 20 6c 65  biguous.  But le
2ea50 67 61 63 79 20 61 75 74 68 6f 72 69 7a 61 74 69  gacy authorizati
2ea60 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20 6d 69 67  on callbacks mig
2ea70 68 74 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  ht.    ** assume
2ea80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
2ea90 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64   is non-NULL and
2eaa0 20 73 65 67 66 61 75 6c 74 2e 20 20 54 68 65 20   segfault.  The 
2eab0 75 73 65 20 6f 66 20 61 6e 20 65 6d 70 74 79 0a  use of an empty.
2eac0 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 20 66 6f      ** string fo
2ead0 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d  r the fake colum
2eae0 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20 73 61 66  n name seems saf
2eaf0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
2eb00 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  f( pItem->colUse
2eb10 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d==0 ){.      sq
2eb20 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
2eb30 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
2eb40 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  AD, pItem->zName
2eb50 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  , "", pItem->zDa
2eb60 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a  tabase);.    }..
2eb70 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2eb80 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2eb90 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
2eba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
2ebb0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
2ebc0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
2ebd0 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
2ebe0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
2ebf0 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70   */.    pSub = p
2ec00 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2ec10 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
2ec20 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
2ec30 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65  /* Sometimes the
2ec40 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71   code for a subq
2ec50 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e  uery will be gen
2ec60 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  erated more than
2ec70 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66  .    ** once, if
2ec80 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
2ec90 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45   part of the WHE
2eca0 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c  RE clause in a L
2ecb0 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a  EFT JOIN,.    **
2ecc0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49   for example.  I
2ecd0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20  n that case, do 
2ece0 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74  not regenerate t
2ecf0 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66  he code to manif
2ed00 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65  est.    ** a vie
2ed10 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74  w or the co-rout
2ed20 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ine to implement
2ed30 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69   a view.  The fi
2ed40 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20  rst instance.   
2ed50 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e   ** is sufficien
2ed60 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75  t, though the su
2ed70 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69  broutine to mani
2ed80 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f  fest the view do
2ed90 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  es need.    ** t
2eda0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61  o be invoked aga
2edb0 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  in. */.    if( p
2edc0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2edd0 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  b ){.      if( p
2ede0 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2edf0 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  utine==0 ){.    
2ee00 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 72 6f      /* The subro
2ee10 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6e 69 66  utine that manif
2ee20 65 73 74 73 20 74 68 65 20 76 69 65 77 20 6d 69  ests the view mi
2ee30 67 68 74 20 62 65 20 61 20 6f 6e 65 2d 74 69 6d  ght be a one-tim
2ee40 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20  e routine,.     
2ee50 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d 69 67 68     ** or it migh
2ee60 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 72  t need to be rer
2ee70 75 6e 20 6f 6e 20 65 61 63 68 20 69 74 65 72 61  un on each itera
2ee80 74 69 6f 6e 20 62 65 63 61 75 73 65 20 69 74 0a  tion because it.
2ee90 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f 64          ** encod
2eea0 65 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  es a correlated 
2eeb0 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20  subquery. */.   
2eec0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
2eed0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
2eee0 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  v, pItem->addrFi
2eef0 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d  llSub)->opcode==
2ef00 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20 20 20 20  OP_Once );.     
2ef10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ef20 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2ef30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2ef40 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
2ef50 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d  illSub);.      }
2ef60 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2ef70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2ef80 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
2ef90 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
2efa0 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
2efb0 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
2efc0 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
2efd0 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
2efe0 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
2eff0 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
2f000 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
2f010 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
2f020 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
2f030 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
2f040 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2f050 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
2f060 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
2f070 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
2f080 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
2f090 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
2f0a0 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
2f0b0 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
2f0c0 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
2f0d0 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
2f0e0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
2f0f0 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
2f100 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
2f110 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69      /* Make copi
2f120 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57  es of constant W
2f130 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d  HERE-clause term
2f140 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
2f150 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a  uery down.    **
2f160 20 69 6e 73 69 64 65 20 74 68 65 20 73 75 62 71   inside the subq
2f170 75 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e 20  uery.  This can 
2f180 68 65 6c 70 20 74 68 65 20 73 75 62 71 75 65 72  help the subquer
2f190 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66  y to run more ef
2f1a0 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a  ficiently..    *
2f1b0 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74 65 6d  /.    if( (pItem
2f1c0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
2f1d0 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20 20  JT_OUTER)==0.   
2f1e0 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65    && pushDownWhe
2f1f0 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  reTerms(pParse, 
2f200 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  pSub, p->pWhere,
2f210 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2f220 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45  .    ){.#if SELE
2f230 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2f240 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2f250 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2f260 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x100 ){.        
2f270 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
2f280 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
2f290 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  er WHERE-clause 
2f2a0 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b  push-down:\n"));
2f2b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f2c0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2f2d0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , p, 0);.      }
2f2e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
2f2f0 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e     zSavedAuthCon
2f300 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
2f310 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
2f320 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
2f330 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a  ntext = pItem->z
2f340 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  Name;..    /* Ge
2f350 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69  nerate code to i
2f360 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62  mplement the sub
2f370 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20  query.    **.   
2f380 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   ** The subquery
2f390 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
2f3a0 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
2f3b0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
2f3c0 69 73 0a 20 20 20 20 2a 2a 20 67 75 61 72 61 6e  is.    ** guaran
2f3d0 74 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f  teed to be the o
2f3e0 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68  uter loop (so th
2f3f0 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e  at it does not n
2f400 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eed to be.    **
2f410 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20 74   computed more t
2f420 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a  han once).    **
2f430 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72  .    ** TODO: Ar
2f440 65 20 74 68 65 72 65 20 6f 74 68 65 72 20 72 65  e there other re
2f450 61 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29  asons beside (1)
2f460 20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75   to use a co-rou
2f470 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c  tine.    ** impl
2f480 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20  ementation?.    
2f490 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a  */.    if( i==0.
2f4a0 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73       && (pTabLis
2f4b0 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
2f4c0 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c         || (pTabL
2f4d0 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69  ist->a[1].fg.joi
2f4e0 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a  ntype&(JT_LEFT|J
2f4f0 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f  T_CROSS))!=0)  /
2f500 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 29 7b 0a  * (1) */.    ){.
2f510 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65        /* Impleme
2f520 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  nt a co-routine 
2f530 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e  that will return
2f540 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2f550 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2f560 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68    ** set on each
2f570 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
2f580 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
2f590 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
2f5a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2f5b0 28 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20 20 20  (v)+1;.     .   
2f5c0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
2f5d0 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
2f5e0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
2f5f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2f600 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
2f610 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
2f620 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  urn, 0, addrTop)
2f630 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2f640 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2f650 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2f660 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ));.      pItem-
2f670 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61  >addrFillSub = a
2f680 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71  ddrTop;.      sq
2f690 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
2f6a0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
2f6b0 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
2f6c0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2f6d0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
2f6e0 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
2f6f0 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
2f700 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
2f710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f720 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2f730 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
2f740 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
2f750 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
2f760 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
2f770 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76       pItem->fg.v
2f780 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
2f790 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2f7a0 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
2f7b0 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
2f7c0 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
2f7d0 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65  ine(v, pItem->re
2f7e0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2f7f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2f800 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
2f810 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f820 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
2f830 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
2f840 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
2f850 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
2f860 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
2f870 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
2f880 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
2f890 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
2f8a0 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
2f8b0 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
2f8c0 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
2f8d0 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
2f8e0 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2f8f0 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
2f900 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
2f910 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
2f920 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
2f930 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
2f940 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
2f950 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
2f960 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2f970 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
2f980 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
2f990 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
2f9a0 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73 74 72  tAddr;.      str
2f9b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2f9c0 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20 20   *pPrior;..     
2f9d0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
2f9e0 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
2f9f0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2fa00 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2fa10 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2fa20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
2fa30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2fa40 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
2fa50 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2fa60 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
2fa70 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
2fa80 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
2fa90 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f  ( pItem->fg.isCo
2faa0 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20  rrelated==0 ){. 
2fab0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2fac0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
2fad0 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
2fae0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
2faf0 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
2fb00 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
2fb10 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
2fb20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
2fb30 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
2fb40 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
2fb50 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
2fb60 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
2fb70 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
2fb80 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
2fb90 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2fba0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2fbb0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
2fbc0 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
2fbd0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2fbe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fbf0 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
2fc00 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
2fc10 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
2fc20 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2fc30 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
2fc40 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53 65     pPrior = isSe
2fc50 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62 4c  lfJoinView(pTabL
2fc60 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20 20  ist, pItem);.   
2fc70 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 7b     if( pPrior ){
2fc80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fc90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fca0 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d 2d  _OpenDup, pItem-
2fcb0 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f 72  >iCursor, pPrior
2fcc0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2fcd0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2fce0 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2fcf0 6c 65 63 74 49 64 2c 20 70 50 72 69 6f 72 2d 3e  lectId, pPrior->
2fd00 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  iSelectId);.    
2fd10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
2fd20 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  or->pSelect!=0 )
2fd30 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  ;.        pSub->
2fd40 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
2fd50 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e 53  ior->pSelect->nS
2fd60 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
2fd70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2fd80 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
2fd90 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
2fda0 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
2fdb0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2fdc0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
2fdd0 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
2fde0 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
2fdf0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
2fe00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2fe10 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
2fe20 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
2fe30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
2fe40 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
2fe50 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65  gEst = pSub->nSe
2fe60 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
2fe70 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71  f( onceAddr ) sq
2fe80 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2fe90 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a  e(v, onceAddr);.
2fea0 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20        retAddr = 
2feb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fec0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2fed0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2fee0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2fef0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
2ff00 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2ff10 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
2ff20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2ff30 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72  P1(v, topAddr, r
2ff40 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73  etAddr);.      s
2ff50 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2ff60 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
2ff70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
2ff80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ff90 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2ffa0 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  d;.    pParse->n
2ffb0 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65  Height -= sqlite
2ffc0 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
2ffd0 74 28 70 29 3b 0a 20 20 20 20 70 50 61 72 73 65  t(p);.    pParse
2ffe0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
2fff0 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
30000 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  xt;.#endif.  }..
30010 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65    /* Various ele
30020 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c  ments of the SEL
30030 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  ECT copied into 
30040 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
30050 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69  for.  ** conveni
30060 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  ence */.  pEList
30070 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
30080 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
30090 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
300a0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
300b0 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
300c0 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63  ving;.  sDistinc
300d0 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73  t.isTnct = (p->s
300e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
300f0 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20  tinct)!=0;..#if 
30100 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
30110 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
30120 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
30130 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x400 ){.    SELE
30140 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
30150 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61  arse,p,("After a
30160 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61  ll FROM-clause a
30170 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
30180 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
30190 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
301a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
301b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55  ifdef SQLITE_COU
301c0 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a  NTOFVIEW_OPTIMIZ
301d0 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f 70 74 69  ATION.  if( Opti
301e0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
301f0 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
30200 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c 49 54 45  Flattener|SQLITE
30210 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29 0a 20 20  _CountOfView).  
30220 20 26 26 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f   && countOfViewO
30230 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72  ptimization(pPar
30240 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20 20 20 20  se, p).  ){.    
30250 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
30260 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
30270 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 45 4c 69  ct_end;.    pELi
30280 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
30290 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
302a0 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  ->pSrc;.  }.#end
302b0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
302c0 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43  query is DISTINC
302d0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
302e0 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e  BY but is not an
302f0 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20   aggregate, and 
30300 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c  .  ** if the sel
30310 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20  ect-list is the 
30320 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45  same as the ORDE
30330 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20  R BY list, then 
30340 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20  this query.  ** 
30350 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
30360 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20   as a GROUP BY. 
30370 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
30380 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
30390 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
303a0 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  NCT xyz FROM ...
303b0 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
303c0 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73  **.  ** is trans
303d0 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a  formed to:.  **.
303e0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
303f0 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f  xyz FROM ... GRO
30400 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20  UP BY xyz ORDER 
30410 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
30420 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
30430 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73   is preferred as
30440 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20   a single index 
30450 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20  (or temp-table) 
30460 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65  may be .  ** use
30470 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f  d for both the O
30480 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54  RDER BY and DIST
30490 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e  INCT processing.
304a0 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a   As originally .
304b0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65    ** written the
304c0 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20   query must use 
304d0 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  a temp-table for
304e0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
304f0 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a   the ORDER .  **
30500 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
30510 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f  , and an index o
30520 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d  r separate temp-
30530 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74  table for the ot
30540 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
30550 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
30560 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
30570 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
30580 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73  istinct .   && s
30590 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
305a0 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64  mpare(sSort.pOrd
305b0 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31  erBy, pEList, -1
305c0 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d  )==0.  ){.    p-
305d0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
305e0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70  _Distinct;.    p
305f0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
30600 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
30610 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
30620 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f  EList, 0);.    /
30630 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76  * Notice that ev
30640 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69  en thought SF_Di
30650 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20  stinct has been 
30660 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e  cleared from p->
30670 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a  selFlags,.    **
30680 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69   the sDistinct.i
30690 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73  sTnct is still s
306a0 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e  et.  Hence, isTn
306b0 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  ct represents th
306c0 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61  e.    ** origina
306d0 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65  l setting of the
306e0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61   SF_Distinct fla
306f0 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65  g, not the curre
30700 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  nt setting */.  
30710 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69    assert( sDisti
30720 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23  nct.isTnct );..#
30730 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
30740 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
30750 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
30760 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
30770 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
30780 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
30790 54 72 61 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e  Transform DISTIN
307a0 43 54 20 69 6e 74 6f 20 47 52 4f 55 50 20 42 59  CT into GROUP BY
307b0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71  :\n"));.      sq
307c0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
307d0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
307e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
307f0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
30800 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
30810 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  use, then create
30820 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
30830 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74  dex to.  ** do t
30840 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74  he sorting.  But
30850 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70   this sorting ep
30860 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69  hemeral index mi
30870 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20  ght end up.  ** 
30880 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20  being unused if 
30890 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20  the data can be 
308a0 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
308b0 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20  -sorted order.. 
308c0 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20 74   ** If that is t
308d0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
308e0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
308f0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
30900 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e  ill be.  ** chan
30910 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
30920 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65  p once we figure
30930 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
30940 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20  rting index is. 
30950 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   ** not needed. 
30960 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53   The sSort.addrS
30970 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c  ortIndex variabl
30980 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
30990 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61  ilitate.  ** tha
309a0 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
309b0 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
309c0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
309d0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
309e0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
309f0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
30a00 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70  (pParse, sSort.p
30a10 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69  OrderBy, 0, pELi
30a20 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
30a30 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d  sSort.iECursor =
30a40 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
30a50 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
30a60 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
30a70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30a80 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
30a90 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
30aa0 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
30ab0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
30ac0 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74  ->nExpr+1+pEList
30ad0 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20  ->nExpr, 0,.    
30ae0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
30af0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
30b00 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c  O.      );.  }el
30b10 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  se{.    sSort.ad
30b20 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31  drSortIndex = -1
30b30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
30b40 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
30b50 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
30b60 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
30b70 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
30b80 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
30b90 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
30ba0 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
30bb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30bc0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
30bd0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
30be0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
30bf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
30c00 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
30c10 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
30c20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
30c30 76 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65  v);.  if( (p->se
30c40 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65  lFlags & SF_Fixe
30c50 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20  dLimit)==0 ){.  
30c60 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
30c70 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c  = 320;  /* 4 bil
30c80 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d  lion rows */.  }
30c90 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
30ca0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
30cb0 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28   p, iEnd);.  if(
30cc0 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26   p->iLimit==0 &&
30cd0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
30ce0 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73  ndex>=0 ){.    s
30cf0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
30d00 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e  Opcode(v, sSort.
30d10 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f  addrSortIndex, O
30d20 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20  P_SorterOpen);. 
30d30 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61     sSort.sortFla
30d40 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55  gs |= SORTFLAG_U
30d50 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20  seSorter;.  }.. 
30d60 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65   /* Open an ephe
30d70 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  meral index to u
30d80 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
30d90 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
30da0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
30db0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
30dc0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
30dd0 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
30de0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
30df0 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
30e00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
30e10 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
30e20 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
30e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e40 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
30e50 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  tabTnct, 0, 0,. 
30e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e70 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
30e80 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  r*)keyInfoFromEx
30e90 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
30ea0 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20  ->pEList,0,0),. 
30eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ec0 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
30ed0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
30ee0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
30ef0 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
30f00 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
30f10 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
30f20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
30f30 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
30f40 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
30f50 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
30f60 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
30f70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
30f80 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
30f90 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
30fa0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
30fb0 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
30fc0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
30fd0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
30fe0 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
30ff0 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e  Tnct ? WHERE_WAN
31000 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b  T_DISTINCT : 0);
31010 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45  .    assert( WHE
31020 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46  RE_USE_LIMIT==SF
31030 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20  _FixedLimit );. 
31040 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d     wctrlFlags |=
31050 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
31060 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20  F_FixedLimit;.. 
31070 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
31080 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
31090 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
310a0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
310b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
310c0 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74  t, pWhere, sSort
310d0 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  .pOrderBy,.     
310e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
31100 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c  ist, wctrlFlags,
31110 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b   p->nSelectRow);
31120 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
31130 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
31140 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
31150 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
31160 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
31170 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
31180 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
31190 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
311a0 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
311b0 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
311c0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
311d0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
311e0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
311f0 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
31200 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
31210 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
31220 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
31230 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
31240 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72    }.    if( sSor
31250 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
31260 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
31270 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
31280 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
31290 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f  ;.      sSort.bO
312a0 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20  rderedInnerLoop 
312b0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72  = sqlite3WhereOr
312c0 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70  deredInnerLoop(p
312d0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
312e0 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
312f0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
31300 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
31310 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
31320 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
31330 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
31340 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
31350 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
31360 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
31370 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
31380 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
31390 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
313a0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
313b0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
313c0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
313d0 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
313e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
313f0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
31400 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
31410 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
31420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31430 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
31440 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
31450 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
31460 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
31470 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
31480 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
31490 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73  p->pEList==pELis
314a0 74 20 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49  t );.    selectI
314b0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
314c0 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
314d0 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
314e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
314f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
31500 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
31510 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  (pWInfo),.      
31520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
31530 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
31540 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a  abel(pWInfo));..
31550 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
31560 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
31570 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
31580 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
31590 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
315a0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
315b0 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   when there exis
315c0 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
315d0 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50  tions or a GROUP
315e0 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a   BY clause.    *
315f0 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20  * or both */.   
31600 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
31610 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
31620 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
31630 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
31640 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
31650 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
31660 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
31670 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
31680 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
31690 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
316a0 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
316b0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
316c0 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
316d0 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
316e0 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
316f0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
31700 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
31710 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
31720 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
31730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31740 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
31750 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
31760 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
31770 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31790 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
317a0 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
317b0 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
317c0 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
317d0 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
317e0 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
317f0 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
31800 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
31810 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
31820 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
31830 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
31840 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
31850 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
31860 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
31870 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  T */.    int sor
31880 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  tPTab = 0;   /* 
31890 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64  Pseudotable used
318a0 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69   to decode sorti
318b0 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ng results */.  
318c0 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20    int sortOut = 
318d0 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  0;    /* Output 
318e0 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68  register from th
318f0 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
31900 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d  int orderByGrp =
31910 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74   0; /* True if t
31920 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  he GROUP BY and 
31930 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68 65  ORDER BY are the
31940 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   same */..    /*
31950 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
31960 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
31970 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
31980 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
31990 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
319a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
319b0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
319c0 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
319d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319e0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
319f0 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
31a00 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
31a10 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
31a20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
31a30 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
31a40 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
31a50 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
31a60 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
31a70 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
31a80 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
31a90 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
31aa0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
31ab0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
31ac0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
31ad0 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
31ae0 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
31af0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
31b00 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
31b10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
31b20 20 20 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d      assert( 66==
31b30 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
31b40 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
31b50 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36  p->nSelectRow>66
31b60 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
31b70 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65   = 66;.    }else
31b80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
31b90 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
31ba0 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  (1) );.      p->
31bb0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
31bc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
31bd0 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
31be0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
31bf0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
31c00 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
31c10 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20    ** identical, 
31c20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70  then it may be p
31c30 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62  ossible to disab
31c40 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  le the ORDER BY 
31c50 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f  clause .    ** o
31c60 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68  n the grounds th
31c70 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  at the GROUP BY 
31c80 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
31c90 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
31ca0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63  .    ** in the c
31cb0 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74  orrect order. It
31cc0 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20   also may not - 
31cd0 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67  the GROUP BY mig
31ce0 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20  ht use a.    ** 
31cf0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 74  database index t
31d00 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20  hat causes rows 
31d10 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f  to be grouped to
31d20 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69 72  gether as requir
31d30 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f  ed.    ** but no
31d40 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65  t actually sorte
31d50 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 72  d. Either way, r
31d60 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
31d70 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f  hat the.    ** O
31d80 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55  RDER BY and GROU
31d90 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65  P BY clauses are
31da0 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65 74   the same by set
31db0 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79  ting the orderBy
31dc0 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  Grp.    ** varia
31dd0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ble.  */.    if(
31de0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
31df0 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79  Compare(pGroupBy
31e00 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
31e10 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
31e20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31    orderByGrp = 1
31e30 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
31e40 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
31e50 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
31e60 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
31e70 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
31e80 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
31e90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
31ea0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
31eb0 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
31ec0 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
31ed0 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
31ee0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
31ef0 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
31f00 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
31f10 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
31f20 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
31f30 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
31f40 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
31f50 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
31f60 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
31f70 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
31f80 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
31f90 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
31fa0 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
31fb0 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
31fc0 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
31fd0 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73  fo.mnReg = pPars
31fe0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73  e->nMem+1;.    s
31ff0 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
32000 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
32010 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
32020 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  xpr : 0;.    sAg
32030 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
32040 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
32050 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
32060 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
32070 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
32080 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
32090 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72  gList(&sNC, sSor
320a0 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  t.pOrderBy);.   
320b0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
320c0 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70        if( pGroup
320d0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  By ){.        as
320e0 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d 70 2d  sert( pWhere==p-
320f0 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20 20 20  >pWhere );.     
32100 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65     havingToWhere
32110 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
32120 79 2c 20 70 48 61 76 69 6e 67 2c 20 26 70 2d 3e  y, pHaving, &p->
32130 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
32140 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
32150 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ere;.      }.   
32160 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
32170 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
32180 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
32190 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
321a0 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
321b0 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
321c0 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  mn;.    if( p->p
321d0 47 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70 2d  GroupBy==0 && p-
321e0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20 73  >pHaving==0 && s
321f0 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d 31  AggInfo.nFunc==1
32200 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78   ){.      minMax
32210 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  Flag = minMaxQue
32220 72 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ry(db, sAggInfo.
32230 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c 20  aFunc[0].pExpr, 
32240 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 29  &pMinMaxOrderBy)
32250 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
32260 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20     minMaxFlag = 
32270 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
32280 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RMAL;.    }.    
32290 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
322a0 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
322b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
322c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
322d0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
322e0 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
322f0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
32300 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
32310 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
32320 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
32330 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
32340 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
32350 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
32360 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  ist);.      sNC.
32370 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49  ncFlags &= ~NC_I
32380 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a  nAggFunc;.    }.
32390 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52      sAggInfo.mxR
323a0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
323b0 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  m;.    if( db->m
323c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
323d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 23  to select_end;.#
323e0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
323f0 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
32400 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
32410 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
32420 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
32430 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
32440 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
32450 74 65 72 20 61 67 67 72 65 67 61 74 65 20 61 6e  ter aggregate an
32460 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20  alysis:\n"));.  
32470 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
32480 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
32490 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  0);.      for(ii
324a0 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e  =0; ii<sAggInfo.
324b0 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a  nColumn; ii++){.
324c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
324d0 65 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d  ebugPrintf("agg-
324e0 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d 3d  column[%d] iMem=
324f0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
32500 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e     ii, sAggInfo.
32510 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a  aCol[ii].iMem);.
32520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
32530 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73  reeViewExpr(0, s
32540 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d  AggInfo.aCol[ii]
32550 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
32560 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 69    }.      for(ii
32570 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e  =0; ii<sAggInfo.
32580 6e 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  nFunc; ii++){.  
32590 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
325a0 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66 75  ugPrintf("agg-fu
325b0 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64 5c  nc[%d]: iMem=%d\
325c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
325d0 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  ii, sAggInfo.aFu
325e0 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20  nc[ii].iMem);.  
325f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
32600 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41 67  eViewExpr(0, sAg
32610 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e  gInfo.aFunc[ii].
32620 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
32630 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
32640 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
32650 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
32660 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
32670 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
32680 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
32690 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
326a0 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
326b0 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
326c0 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
326d0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
326e0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
326f0 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
32700 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
32710 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
32720 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
32730 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
32740 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f      /* A-vs-B co
32750 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a  mparision jump *
32760 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
32770 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53  OutputRow;  /* S
32780 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
32790 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
327a0 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
327b0 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74        int regOut
327c0 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74  putRow;   /* Ret
327d0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
327e0 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
327f0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
32800 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
32810 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74  bort;   /* Set t
32820 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
32830 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
32840 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
32850 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20  oop;  /* Top of 
32860 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
32870 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
32880 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54  SortingIdx; /* T
32890 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
328a0 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
328b0 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
328c0 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
328d0 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;      /* Subrou
328e0 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
328f0 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
32900 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  or */.      int 
32910 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20  regReset;       
32920 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
32930 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
32940 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
32950 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  */..      /* If 
32960 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
32970 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
32980 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
32990 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
329a0 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
329b0 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
329c0 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
329d0 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
329e0 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
329f0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
32a00 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
32a10 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70   the OP_SorterOp
32a20 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  en instruction. 
32a30 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
32a40 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
32a50 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
32a60 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
32a70 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
32a80 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
32a90 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
32aa0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
32ab0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
32ac0 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f  pBy, 0, sAggInfo
32ad0 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  .nColumn);.     
32ae0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
32af0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
32b00 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
32b10 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
32b20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
32b30 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
32b40 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
32b50 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
32b60 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
32b70 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
32b80 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
32b90 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
32ba0 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
32bb0 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
32bc0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
32bd0 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
32be0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
32bf0 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
32c00 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
32c10 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
32c20 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
32c30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
32c40 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
32c50 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
32c60 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
32c70 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
32c80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
32c90 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
32ca0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
32cb0 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
32cc0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
32cd0 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
32ce0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
32cf0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
32d00 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
32d10 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
32d20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
32d30 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
32d40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
32d50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
32d60 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
32d70 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
32d80 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
32d90 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
32da0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
32db0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32dc0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
32dd0 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
32de0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
32df0 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
32e00 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
32e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32e20 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
32e30 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
32e40 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
32e50 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
32e60 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
32e70 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
32e80 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
32e90 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
32ea0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
32eb0 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
32ec0 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
32ed0 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
32ee0 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
32ef0 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
32f00 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
32f10 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
32f20 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
32f30 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
32f40 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
32f50 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
32f60 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
32f70 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
32f80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
32f90 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
32fa0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
32fb0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
32fc0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
32fd0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
32fe0 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
32ff0 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  y, 0,.          
33000 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20  WHERE_GROUPBY | 
33010 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48  (orderByGrp ? WH
33020 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
33030 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b  : 0), 0.      );
33040 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
33050 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
33060 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
33070 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
33080 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d  Ordered(pWInfo)=
33090 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
330a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
330b0 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
330c0 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
330d0 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
330e0 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
330f0 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
33100 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
33110 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
33120 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
33130 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
33140 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
33150 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
33160 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
33170 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
33180 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
33190 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
331a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
331b0 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
331c0 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
331d0 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
331e0 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
331f0 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
33200 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
33210 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
33220 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
33230 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
33240 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
33250 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
33260 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
33270 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
33280 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
33290 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
332a0 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
332b0 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
332c0 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
332d0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
332e0 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
332f0 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
33300 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
33310 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
33320 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
33330 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
33340 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
33350 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
33360 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
33370 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
33380 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
33390 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
333a0 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
333b0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
333c0 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
333d0 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
333e0 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
333f0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
33400 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
33410 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
33420 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
33430 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
33440 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
33450 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
33460 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
33470 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
33480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33490 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
334a0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
334b0 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
334c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
334d0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
334e0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
334f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
33500 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
33510 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
33520 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
33530 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
33540 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
33550 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
33560 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
33570 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
33580 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
33590 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
335a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
335b0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
335c0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
335d0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
335e0 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
335f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
33600 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
33610 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20  ToReg(pParse, . 
33620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
33640 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
33650 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
33660 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20  Table, r1);.    
33670 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
33680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33690 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
336a0 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
336b0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
336c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
336d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
336e0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
336f0 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
33700 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
33710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33720 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
33730 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
33740 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
33750 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
33760 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
33770 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
33780 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
33790 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
337a0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
337b0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
337c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
337d0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
337e0 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
337f0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54  nfo.sortingIdxPT
33800 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20  ab = sortPTab = 
33810 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
33820 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20          sortOut 
33830 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
33840 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
33850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33860 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
33870 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61  nPseudo, sortPTa
33880 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c  b, sortOut, nCol
33890 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
338a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
338b0 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73  OP_SorterSort, s
338c0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
338d0 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
338e0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
338f0 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20  t((v, "GROUP BY 
33900 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76  sort")); VdbeCov
33910 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
33920 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
33930 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
33940 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
33950 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
33960 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20  se);..      }.. 
33970 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
33980 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72  ndex or temporar
33990 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  y table used by 
339a0 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72  the GROUP BY sor
339b0 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  t.      ** will 
339c0 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65  naturally delive
339d0 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72  r rows in the or
339e0 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79 20  der required by 
339f0 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
33a00 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61     ** clause, ca
33a10 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72  ncel the ephemer
33a20 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f  al table open co
33a30 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20  ded earlier..   
33a40 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
33a50 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
33a60 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72  zation - the cor
33a70 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75  rect answer shou
33a80 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64  ld result regard
33a90 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  less..      ** U
33aa0 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72  se the SQLITE_Gr
33ab0 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20  oupByOrder flag 
33ac0 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
33ad0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74  CTRL_OPTIMIZER t
33ae0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61  o .      ** disa
33af0 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  ble this optimiz
33b00 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e  ation for testin
33b10 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a  g purposes.  */.
33b20 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72 42        if( orderB
33b30 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61  yGrp && Optimiza
33b40 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
33b50 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
33b60 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  der) .       && 
33b70 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20  (groupBySort || 
33b80 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f  sqlite3WhereIsSo
33b90 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20  rted(pWInfo)).  
33ba0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
33bb0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
33bc0 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
33bd0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
33be0 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
33bf0 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
33c00 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
33c10 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
33c20 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
33c30 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
33c40 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
33c50 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
33c60 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
33c70 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
33c80 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
33c90 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
33ca0 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
33cb0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
33cc0 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
33cd0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
33ce0 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
33cf0 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
33d00 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
33d10 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
33d20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
33d30 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
33d40 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
33d50 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
33d60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
33d70 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
33d80 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
33d90 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
33da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33db0 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
33dc0 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ta, sAggInfo.sor
33dd0 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
33de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33df0 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74     sortOut, sort
33e00 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  PTab);.      }. 
33e10 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
33e20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
33e30 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
33e40 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
33e50 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
33e60 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
33e70 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74   OP_Column, sort
33e80 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  PTab, j, iBMem+j
33e90 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
33ea0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
33eb0 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
33ec0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
33ed0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
33ee0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
33ef0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
33f00 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
33f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
33f20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
33f30 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
33f40 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
33f50 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
33f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f70 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
33f80 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
33f90 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
33fa0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
33fb0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
33fc0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
33fd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33fe0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
33ff0 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20  _Jump, addr1+1, 
34000 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62  0, addr1+1); Vdb
34010 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
34020 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
34030 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
34040 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
34050 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
34060 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
34070 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
34080 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
34090 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
340a0 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
340b0 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
340c0 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
340d0 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
340e0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
340f0 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
34100 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
34110 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
34120 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
34130 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
34140 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
34150 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
34160 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
34170 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
34180 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
34190 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
341a0 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
341b0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
341c0 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
341d0 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
341e0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
341f0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
34200 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
34210 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
34220 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
34230 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34240 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
34250 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
34260 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
34270 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
34280 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
34290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
342a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
342b0 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
342c0 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64  ag, addrEnd); Vd
342d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
342e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
342f0 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
34300 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
34310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34320 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
34330 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
34340 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
34350 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
34360 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
34370 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
34380 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
34390 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
343a0 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
343b0 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
343c0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
343d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
343e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
343f0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
34400 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
34410 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
34420 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
34430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34440 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
34450 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
34460 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34470 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
34480 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
34490 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
344a0 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
344b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
344c0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
344d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
344e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
344f0 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
34500 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
34510 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
34520 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
34530 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
34540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34550 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
34560 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
34570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
34580 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
34590 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
345a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
345b0 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
345c0 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
345d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
345e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
345f0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
34600 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
34610 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
34620 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
34630 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
34640 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
34650 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
34660 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
34670 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
34680 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
34690 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
346a0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
346b0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
346c0 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
346d0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
346e0 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
346f0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
34700 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
34710 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
34720 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
34730 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
34740 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
34750 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
34760 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
34770 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
34780 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
34790 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
347a0 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
347b0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
347c0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
347d0 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
347e0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
347f0 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
34800 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
34810 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
34820 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
34830 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
34840 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
34850 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
34860 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
34870 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
34880 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
34890 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
348a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
348b0 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
348c0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
348d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
348e0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
348f0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
34900 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
34910 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
34920 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
34930 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
34940 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
34950 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
34960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34970 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
34980 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
34990 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
349a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
349b0 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
349c0 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
349d0 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
349e0 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
349f0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
34a00 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
34a10 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
34a20 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
34a30 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
34a40 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
34a50 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
34a60 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
34a70 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
34a80 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
34a90 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
34aa0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
34ab0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
34ac0 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f  rse, p, -1, &sSo
34ad0 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
34ae0 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74            &sDist
34af0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
34b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b10 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
34b20 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
34b30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34b40 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34b50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
34b60 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
34b70 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
34b80 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
34b90 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
34ba0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
34bb0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
34bc0 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
34bd0 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
34be0 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
34bf0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
34c00 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
34c10 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  v, addrReset);. 
34c20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
34c30 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
34c40 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
34c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34c60 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
34c70 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20  regReset);.     
34c80 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
34c90 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e  pGroupBy.  Begin
34ca0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
34cb0 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50  es without GROUP
34cc0 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65   BY: */.    else
34cd0 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
34ce0 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
34cf0 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
34d00 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
34d10 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
34d20 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
34d30 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
34d40 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
34d50 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
34d60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
34d70 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
34d80 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
34d90 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
34da0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
34db0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
34dc0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
34dd0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
34de0 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
34df0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
34e00 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
34e10 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
34e20 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
34e30 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
34e40 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
34e50 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
34e60 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
34e70 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
34e80 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
34e90 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
34ea0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
34eb0 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
34ec0 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
34ed0 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
34ee0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
34ef0 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
34f00 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
34f10 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
34f20 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
34f30 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
34f40 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
34f50 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
34f60 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
34f70 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
34f80 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
34f90 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
34fa0 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
34fb0 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
34fc0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
34fd0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
34fe0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
34ff0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
35000 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
35010 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
35020 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
35030 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
35040 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
35050 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
35060 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
35070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35080 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
35090 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
350a0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
350b0 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
350c0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
350d0 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
350e0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
350f0 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
35100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35110 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
35120 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
35130 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
35140 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
35150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
35160 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
35170 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
35180 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
35190 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
351a0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
351b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
351c0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
351d0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
351e0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
351f0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
35200 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
35210 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
35220 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73   lowest scan cos
35230 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
35240 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30        ** (2011-0
35250 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20  4-15) Do not do 
35260 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61  a full scan of a
35270 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65  n unordered inde
35280 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
35290 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31        ** (2013-1
352a0 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75  0-03) Do not cou
352b0 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20 69  nt the entries i
352c0 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  n a partial inde
352d0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
352e0 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63        ** In prac
352f0 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f  tice the KeyInfo
35300 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20   structure will 
35310 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20  not be used. It 
35320 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20  is only .       
35330 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65   ** passed to ke
35340 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68  ep OP_OpenRead h
35350 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  appy..        */
35360 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61  .        if( !Ha
35370 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70  sRowid(pTab) ) p
35380 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72  Best = sqlite3Pr
35390 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
353a0 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ab);.        for
353b0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
353c0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
353d0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
353e0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
353f0 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
35400 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
35410 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62  x->szIdxRow<pTab
35420 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20  ->szTabRow.     
35430 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70        && pIdx->p
35440 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a  PartIdxWhere==0.
35450 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 21             && (!
35460 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73  pBest || pIdx->s
35470 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73  zIdxRow<pBest->s
35480 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20  zIdxRow).       
35490 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
354a0 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a    pBest = pIdx;.
354b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
354c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
354d0 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( pBest ){.     
354e0 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65       iRoot = pBe
354f0 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  st->tnum;.      
35500 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
35510 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
35520 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42 65  ndex(pParse, pBe
35530 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  st);.        }..
35540 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
35550 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
35560 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  or, execute the 
35570 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20  OP_Count, close 
35580 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20  the cursor. */. 
35590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
355a0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
355b0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72  P_OpenRead, iCsr
355c0 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29  , iRoot, iDb, 1)
355d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  ;.        if( pK
355e0 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
355f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
35600 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
35610 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  char *)pKeyInfo,
35620 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
35630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35650 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
35660 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  Csr, sAggInfo.aF
35670 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20  unc[0].iMem);.  
35680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35690 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
356a0 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  ose, iCsr);.    
356b0 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c      explainSimpl
356c0 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70  eCount(pParse, p
356d0 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  Tab, pBest);.   
356e0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
356f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
35700 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
35710 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
35720 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
35730 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
35740 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
35750 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
35760 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
35770 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
35780 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
35790 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
357a0 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
357b0 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
357c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
357d0 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
357e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
357f0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
35800 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
35810 6f 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  o);..        /* 
35820 49 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  If this query is
35830 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
35840 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
35850 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 0a  imization, then.
35860 20 20 20 20 20 20 20 20 2a 2a 20 6d 69 6e 4d 61          ** minMa
35870 78 46 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20  xFlag will have 
35880 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
35890 73 65 74 20 74 6f 20 65 69 74 68 65 72 0a 20 20  set to either.  
358a0 20 20 20 20 20 20 2a 2a 20 57 48 45 52 45 5f 4f        ** WHERE_O
358b0 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
358c0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20  ERE_ORDERBY_MAX 
358d0 61 6e 64 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72  and pMinMaxOrder
358e0 42 79 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20  By will.        
358f0 2a 2a 20 62 65 20 61 6e 20 61 70 70 72 6f 70 72  ** be an appropr
35900 69 61 74 65 20 4f 52 44 45 52 20 42 59 20 65 78  iate ORDER BY ex
35910 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65  pression for the
35920 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20   optimization.. 
35930 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35940 20 20 61 73 73 65 72 74 28 20 6d 69 6e 4d 61 78    assert( minMax
35950 46 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45  Flag==WHERE_ORDE
35960 52 42 59 5f 4e 4f 52 4d 41 4c 20 7c 7c 20 70 4d  RBY_NORMAL || pM
35970 69 6e 4d 61 78 4f 72 64 65 72 42 79 21 3d 30 20  inMaxOrderBy!=0 
35980 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
35990 74 28 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42  t( pMinMaxOrderB
359a0 79 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f  y==0 || pMinMaxO
359b0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
359c0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 57 49   );..        pWI
359d0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
359e0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
359f0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
35a00 2c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79  , pMinMaxOrderBy
35a10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a30 20 20 20 20 20 30 2c 20 6d 69 6e 4d 61 78 46 6c       0, minMaxFl
35a40 61 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ag, 0);.        
35a50 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
35a60 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
35a70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
35a80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70      }.        up
35a90 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
35aa0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
35ab0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
35ac0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
35ad0 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20  dered(pWInfo)>0 
35ae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
35af0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
35b00 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
35b10 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
35b20 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
35b30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
35b40 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20   by index",.    
35b50 20 20 20 20 20 20 20 20 20 20 20 20 28 6d 69 6e              (min
35b60 4d 61 78 46 6c 61 67 3d 3d 57 48 45 52 45 5f 4f  MaxFlag==WHERE_O
35b70 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22  RDERBY_MIN?"min"
35b80 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20  :"max")));.     
35b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
35ba0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
35bb0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69  nfo);.        fi
35bc0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
35bd0 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
35be0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Info);.      }..
35bf0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
35c00 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
35c10 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
35c20 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
35c30 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c  ng, addrEnd, SQL
35c40 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
35c50 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
35c60 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
35c70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20  , -1, 0, 0, .   
35c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c90 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
35ca0 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
35cb0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
35cc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
35cd0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
35ce0 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
35cf0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
35d00 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e 63  ..  if( sDistinc
35d10 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  t.eTnctType==WHE
35d20 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
35d30 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70  DERED ){.    exp
35d40 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
35d50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22  arse, "DISTINCT"
35d60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
35d70 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
35d80 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
35d90 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
35da0 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
35db0 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
35dc0 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
35dd0 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
35de0 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
35df0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78  rderBy ){.    ex
35e00 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
35e10 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
35e20 20 20 20 20 20 20 20 20 20 20 20 20 73 53 6f 72              sSor
35e30 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49  t.nOBSat>0 ? "RI
35e40 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45  GHT PART OF ORDE
35e50 52 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22  R BY":"ORDER BY"
35e60 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  );.    generateS
35e70 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
35e80 70 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73  p, &sSort, pELis
35e90 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
35ea0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
35eb0 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
35ec0 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
35ed0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
35ee0 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
35ef0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
35f00 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
35f10 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  d. If there is a
35f20 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50  n error in the P
35f30 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a  arse structure,.
35f40 20 20 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74    ** set the ret
35f50 75 72 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f  urn code to 1. O
35f60 74 68 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20  therwise 0. */. 
35f70 20 72 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e   rc = (pParse->n
35f80 45 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f  Err>0);..  /* Co
35f90 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
35fa0 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
35fb0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
35fc0 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
35fd0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
35fe0 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
35ff0 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
36000 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65  end:.  explainSe
36010 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
36020 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
36030 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20  toreSelectId);. 
36040 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
36050 44 65 6c 65 74 65 28 64 62 2c 20 70 4d 69 6e 4d  Delete(db, pMinM
36060 61 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71  axOrderBy);.  sq
36070 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
36080 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
36090 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
360a0 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  db, sAggInfo.aFu
360b0 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  nc);.#if SELECTT
360c0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53  RACE_ENABLED.  S
360d0 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
360e0 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63  rse,p,("end proc
360f0 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70  essing\n"));.  p
36100 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
36110 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20  dent--;.#endif. 
36120 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.